一、new操作符具体做了什么
创建一个空对象,将空对象的原型指向构造函数的原型
执行构造函数,使用call/apply改变this指针的方向,指向刚刚创建的对象
对构造函数返回值进行判断
如果构造函数用return 显示的返回一个对象,那么new之后,会返回这个对象。
如果构造函数不显示的返回任何数据,或返回一个非对象类型的数据,则默认返回this指定的对象,即构造函数生成的对象。
二、手写实现new的过程
写法一:使用Objcet.create创建对象
function myNew(constructor, ...args) {
// 1. 创建一个空对象,将空对象的原型指向构造函数的原型
let newObj = Object.create(constructor.prototype)
// 2. 执行构造函数,使用call/apply改变this指针的方向,指向刚刚创建的对象
let res = constructor.apply(newObj, args) // 改变this指向新创建的对象
// 3. 对构造函数返回值进行判断
return typeof res === 'object' ? res: newObj
}
写法二:使用字面量创建对象
function myNew(constructor, ...args) {
// 1. 创建一个空对象, 将空对象的原型指向构造函数的原型
let newObj = {}
newObj.__proto__ = constructor.prototype
// Object.setPrototypeOf(obj, personConstructor.prototype)
// 2. 执行构造函数,使用call/apply改变this指针的方向,指向刚刚创建的对象
let res = constructor.apply(newObj, args) // 改变this指向新创建的对象
// 3. 对构造函数返回值进行判断
return typeof res === 'object' ? res: newObj
}