面试的时候很多面试官会问你new内部到底干了啥,或是叫你手写new。如果你还不清楚那么现在就让我们好好聊聊new这个玩意到底干了什么坏事!!
首先,我们简单说明new干了啥
1.在我们使用new的时候,new内部会第一时间给你创建一个空对象,let obj={}
2.然后如果你学过原型链的话,你应该明白对象实例内部的__proto__是等于对象的原型的(prototype),所以你创建的空对象也要符合这个条件,所以让空对象的__proto__(IE没有该属性)成员指向了构造函数的prototype成员对象
3.使用apply调用构造器函数,属性和方法被添加到 this 引用的对象中
4.如果构造函数中没有返回其它对象,那么返回 this,即创建的这个的新对象,否则,返回构造函数中返回的对象
现在看完了,如果你一脸懵逼,那没事,我们结合这段代码,再看一遍,想象你就懂了
function _new(func) {
// 第一步 创建新对象
let obj = {};
// 第二步 空对象的_proto_指向了构造函数的prototype成员对象
obj.__proto__ = func.prototype;//
// 一二步合并就相当于 let obj=Object.create(func.prototype)
// 第三步 使用apply调用构造器函数,属性和方法被添加到 this 引用的对象中
let result = func.apply(obj);
if (result && (typeof (result) == "object" || typeof (result) == "function")) {
// 如果构造函数执行的结果返回的是一个对象,那么返回这个对象
return result;
}
// 如果构造函数返回的不是一个对象,返回创建的新对象
return obj;
}
// 测试
function PP(name) {
this.name = name
}
PP.prototype.sayName = function () { console.log(this.name) }
const p1 = _new(Person)
console.log(p1 instanceof Person) // true
console.log(p1.__proto__ === Person.prototype) // true