单手一个八拍,带你实现new操作符 ~skr skr
2019-07-19 本文已影响1人
sherlockAndy
new 都做了哪些事?
- 创建了一个新对象
- 将新对象的 proto属性 连接到 构造函数的原型 prototype,
- 调用一次函数 并且将this该为指向新创建的对象, 传入参数 判断返回值
- 如果构造函数无返回值,或者不是引用类型,返回新对象即可;否则为 构造函数的返回值。
function myNew(func) {
let res = {}; // 1. 创建一个新对象
if (func.prototype !== null) {
res.__proto__ = func.prototype; // 2.将构造函数的原型对象指向 新对象的原型 属性
}
let ret = func.apply(res, Array.prototype.slice.call(arguments, 1)); // 3. 将构造函数的 this 指向新创建的对象,并调用构造函数
if ((typeof ret === "Object" || typeof ret === "Array") && ret !== null) { // 如果构造函数有返回值且是引用类型, 将它返回, 否则返回新对象
return ret
}
return res
}