new
操作符调用构造函数会执行如下操作:
1.创建空的新对象
2.构造函数的prototype
属性 赋给 新创建的对象的__proto__
属性
3.构造函数中的this指向该对象
4.执行构造函数内部的代码
5.如果构造函数没有显式返回一个对象(或者返回的是一个非对象的基本类型值),那么new
操作会自动返回新创建的对象实例。如果构造函数返回了一个新的对象,则该返回值将替代默认的实例对象被返回。
手动模拟new
操作
function myNew(Fun, ...args) {
// 创建一个空对象
let obj = {};
// 设置原型链
obj.__proto__ = Fun.prototype;
// 调用构造函数,绑定this并传递参数
let res = Fun.apply(obj, args);
// 判断构造函数的返回值是否为对象,如果是则返回该对象,否则返回新创建的实例
return typeof res === 'object' && res !== null ? res : obj;
}