JavaScript new 操作符 OOP(一)
什么是对象
面向对象编程的第一步,就是要生成对象。
典型的面向对象编程语言(比如 C++ 和 Java),都有“类”(class)这个概念。所谓“类”就是对象的模板,对象就是“类”的实例。
JavaScript 语言的对象体系,不是基于“类”的,而是基于构造数`constructor`和原型链`prototype`, 所以JS 专门使用构造函数作为对象模板 ,一个构造函数,可生成多个实列对象,它们有相同的结构
构造函数与普通函数区别
//constructor
var Bird = function () {
this.name = 'lai fu';
};
var bird1 = new Bird(); // 也可以使用 new Bird; 推荐使用前者
console.log(bird1.name) // "lai fu" //ordinary
var a =Bird();
console.log(a) // undefined
console.log(a.name) // typeError
name // 'laifu'
防止把构造函数`constructor`当普通函数使用
//使用 严格模式
function Fubar(foo, bar){
'use strict';
this._foo = foo;
this._bar = bar;
}
Fubar()// TypeError
//判断 this 不是构造函数(constructor)的实列对象 那么手动返回自身constructor function Far(a){
if (!(this instanceof Far)) return new Far(a); this._a=a;
}
Far(1)._a
`new`命令的原理
/**
*新生成一个空对象
*链接到原型
*绑定 this
*返回新对象
**/
function _new(constuctor,param) { // 获得构造函数
let Con = [].shift.call(arguments);
// 链接到原型
let obj = Object.create(Con.prototype);
// 绑定 this,执行构造函数
let result = Con.apply(obj, arguments)
// 确保 new 出来的是个对象
return (typeof(result) === 'object' && result != null) ? result : obj
}
var fn = _new(
function Person (name,age){
this.name = name; this.age = age
}, 'Owen', 28);
fn.name // 'Owen'
new.target
function f() {
console.log(new.target === f);
} f() // false
new f() // true
//可利用 它来判断是否使用 new 命令 function f() {
if (!new.target) {
throw new Error('请使用 new 命令调用!');
}
f() // Uncaught Error: 请使用 new 命令调用!
`this`实质
- 原始的对象以字典结构保存,每一个属性名都对应一个属性描述对象。
var obj = { name: "Owen" };
{
name: {
[[value]]: "Owen" //函数的地址
[[writable]]: true //是否可赋值
[[enumerable]]: true//是否可枚举
[[configurable]]: true//是否可配置
}
}
//属性的值保存在属性描述对象的value属性里面。
如果 a 属性的值是 引用值 那么属性将以下面的形式保存的:
var obj = { fn: function () {} };
/*
{
fn: {
[[value]]:
[[writable]]: true
[[enumerable]]: true
[[configurable]]: true
}
}
*/
var f n= function () {};
var obj = { f: fn }; // 单独执行
fn() // obj 环境执行
obj.f()
(obj.fn = obj.fn)() // window
// 等同于
(function () {
console.log(this);
})() (false || obj.fn)() // window
// 等同于
(false || function () {
console.log(this);
})() (4, obj.fn)() // window
// 等同于
(4, function () {
console.log(this);
})()
var o = {
v: 'hello',
p: [ 'Owen', 18 ],
f: function f() {
this.p.forEach(function (item) {
console.log(this.v + '-' + item);
}, this); //将外层的this传递给forEach方法
}
} o.f() // hello-Owen hello-18
JavaScript new 操作符 OOP(一)的更多相关文章
- JavaScript 原型链 OOP(二)
原型对象 `prototype` - 原型对象的所有属性和方法,都能被实例对象共享; JavaScript 通过构造函数生成新对象,因此构造函数可以视为对象的模板.实例对象的属性和方法,可以定义 ...
- 从头开始学JavaScript (五)——操作符(二)
原文:从头开始学JavaScript (五)--操作符(二) 一.乘性操作符 1.乘法:* 乘法操作符的一些特殊规则: 如果操作数都是数值,按照常规的乘法计算,如果乘积超过了ECMAscri ...
- 从头开始学JavaScript (四)——操作符
原文:从头开始学JavaScript (四)--操作符 一.一元操作符 1.自增自减操作符:分为前置型和后置型: 前置型:++a;--a; 后置型:a++;a--; 例: <script typ ...
- 坑:JavaScript 中 操作符“==” 和“===” 的区别
标题:JavaScript 中 操作符"==" 和"===" 的区别 记录一些很坑的区别: 1. '' == '0' // false 0 == '' // t ...
- JavaScript中+操作符的特殊性
在JavaScript中+操作符有两个作用: (1)加法运算 (2)字符串连接 在使用+操作符进行运算时,当+操作符两边都是数值类型的时候,进行加法运算; 当+操作符两边有任意一边是字符串,则进行字符 ...
- JavaScript 逗号操作符
让我们从一个有趣的微博开始吧. 末尾的c是优先级最低的逗号操作符.逗号操作符是操作符优先级的最后一行,并且很少有文章记录,它隐藏着它的锋芒.它可能不是JavaScript强势操作符,但是我喜欢它.它简 ...
- JavaScript剩余操作符Rest Operator
本文适合JavaScript初学者阅读 剩余操作符 之前这篇文章JavaScript展开操作符(Spread operator)介绍讲解过展开操作符.剩余操作符和展开操作符的表示方式一样,都是三个点 ...
- 细说javascript typeof操作符
细说javascript typeof操作符 typeof定义 typeof是一元运算符,用来返回操作数类型的字符串.下面是ECAMScript5.1关于typeof的标准定义: NOTE:上面表格标 ...
- 初识JavaScript 变量, 操作符, 数组
这里讲的不会太多, 因为所有的语言都是一样的, 一些基本的东西, 所以就随便写写. 变量 变量就是可变的量, 编程角度理解就是用于存储某种/某些数值的存储器. 我们可以把变量具象理解为一个盒子, 而我 ...
随机推荐
- 解释器模式Interpreter详解
原文链接:https://www.cnblogs.com/java-my-life/archive/2012/06/19/2552617.html 在阎宏博士的<JAVA与模式>一书中开头 ...
- 「BZOJ1038」「洛谷P2600」「ZJOI2008」瞭望塔 半平面交+贪心
题目链接 BZOJ/洛谷 题目描述 致力于建设全国示范和谐小村庄的H村村长dadzhi,决定在村中建立一个瞭望塔,以此加强村中的治安. 我们将H村抽象为一维的轮廓.如下图所示: 我们可以用一条山的上方 ...
- js按回车事件提交
$(document).keyup(function (event) { if (event.keyCode == "13") { document.getElementById( ...
- [USACO5.4]奶牛的电信Telecowmunication 最小割
题目描述 农夫约翰的奶牛们喜欢通过电邮保持联系,于是她们建立了一个奶牛电脑网络,以便互相交流.这些机器用如下的方式发送电邮:如果存在一个由c台电脑组成的序列a1,a2,...,a(c),且a1与a2相 ...
- maven部署Tomcat(出现空白页面,最终解决)
- mybatis主键返回语句 使用方法,就是实体类.getid即可拿到返回的id
<insert id="insertSelective" parameterType="com.o2o.Content" useGeneratedKeys ...
- mysql 模糊查询 concat()
concat() 函数,是用来连接字符串. 精确查询: select * from user where name=”zhangsan” 模糊查询: select * from user where ...
- P5020 货币系统 (NOIP2018)
传送门 BFS解法 显然如果一个面额A可以被其他面额表示出来 那么这个面额A就没用了 且如果A不能被其他面额表示,那么A一定有用(A本身的值只有自己可以表示) 发现面额最大不超过 25000 那么设 ...
- 上传文件中文文件名乱码的解决方法以及iconv函数的使用
http://www.jb51.net/article/14530.htm 一般客户端是什么格式就展示什么格式,比如浏览器的UTF-8,windows的GBK
- 基于APPIUM测试微信公众号的UI自动化测试框架(结合Allure2测试报告框架)
框架初衷 前两周组内的小伙伴跟我说她现在测试的微信公众号项目(保险)每次上新产品时测试起来很费时,存在大量的重复操作(点点点),手工测试每个产品可能需要半天到一天的时间,复杂的产品需要两天. 由于保险 ...