new 的作用
- 创建一个新的空对象
- 将构造函数的原型(
prototype)赋值给这个空对象的__proto__属性 - 将构造函数中的this指向这个空对象
- 判断构造函数返回值是否为引用对象,如果有返回值且为引用对象,则返回这个引用对象(即
new关键字无效),如果没有返回值或者返回值为基本类型,则返回这个创建的新对象。
new 的实现
function fakeNew(ConFun, ...args) {
let o = {};
// o.__proto__ = ConFun.prototype;
Object.setPrototypeOf(o, ConFun.prototype);
// o = this
let res = ConFun.apply(o, args);
return res instanceof Object ? res : o;
}