js中的new操作符原理
举一个很常见的例子
function Person(name){
this.name = name;
}
Person.prototype.say = function(){
console.log(this.name);
}
let p = new Person("花花");
p.say(); //花花
为什么会打印出“花花”?为什么构造函数中的 this 就指向了 对象?
这就是 new 的原理起的作用:
1、创建一个类的实例:创建一个空对象obj,然后把这个 obj 对象的 __proto__ 设置为Person.prototype;即创建一个继承自Person.prototype的新对象
2、执行构造函数:执行的时候,相应的参数会被传入,this 会被指定为第1步创建的新实例;
3、返回对象:如果构造函数返回了一个新对象,那么这个新对象会取代步骤1中new出来的实例被返回。如果构造函数没有返回对象,那么new出来的结果为步骤1创建的对象
New实现
function New(Person){
var obj = {'__proto__': Person.prototype}; //第一步
return function() {
Person.apply(obj, arguments); //第二步
return obj; //第三步
}
}