- 要手动实现一个 new 操作符,首先要知道 new 操作符都做了什么事,即构造函数的内部原理:
- 创建一个新对象;
- 链接到原型(将构造函数的 prototype 赋值给新对象的 proto);
- 绑定this(构造函数中的this指向新对象并且调用构造函数)
- 返回新对象
这样我们就可以手动实现一个 new 方法了
function _new(constructor, ...args) {
// 1. 新建一个普通对象
let obj = {};
// 2. _new 函数本身是可以接收参数的 但是又不知道具体会接收几个 接收什么参数 故用下面的方法
// let [constructor, ...args] = [...arguments]; // 解构赋值 constructor 是 构造函数哈哈哈
// 3. 建立联系 生成的这个对象是constructor的实例 需要使用__proto__ 和 构造函数的 prototype 建立联系
obj.__proto__ = constructor.prototype;
// 4. 执行constructor构造函数 并且 this 指向 自己新建的对象
let result = constructor.apply(obj, args);
// 5. 判断构造函数是否返回的是 对象或者 函数 是的话直接返回这个结果 如果不是 那么返回 自己创建的obj 对象
if (result && (typeof (result) == "object" || typeof (result) == "function")) {
return result;
}
return obj;
}