3.4.1 js new操作符
var Person = function(name){
this.name = name;
}
Person.prototype.sayHello = function() {
console.log('hello ' + this.name);
}
var p1 = new Person('HANMEI');
p1.sayHello();
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
来看看var obj = new O()这条语句发生了什么:
var obj = (function(){
var obj = {};
obj.__proto__ = O.prototype;
//其他赋值语句...
return obj;
})();
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
也就是说var obj = new O()返回了一个obj对象,它的隐式原型链(proto)是指向O原型(prototype)的。这就是new的内部工作方式。
1.创建一个类的实例:创建一个空对象obj,然后把这个空对象的__proto__设置为Person.prototype(即构造函数的prototype);
2.初始化实例:构造函数Person被传入参数并调用,关键字this被设定指向该实例obj;
3.返回实例obj。
New实现:
function New(F){
var obj = {'__proto__': F.prototype}; /*第一步*/
return function() {
F.apply(obj, arguments); /*第二步*/
return obj; /*第三步*/
}
}
1
2
3
4
5
6
7
2
3
4
5
6
7
instanceof
判断一个实例是否属于某种类型
其实 instanceof 主要的实现原理就是只要右边变量的 prototype 在左边变量的原型链上即可。
因此,instanceof 在查找的过程中会遍历左边变量的原型链,直到找到右边变量的 prototype,
如果查找失败,则会返回 false,告诉我们左边变量并非是右边变量的实例。
1
2
3
4
5
2
3
4
5