推荐答案
// www.javascriptcn.com code example
function myNew(constructor, ...args) {
// 1. 创建一个新对象,并将其原型指向构造函数的原型
const obj = Object.create(constructor.prototype);
// 2. 调用构造函数,并将 this 绑定到新创建的对象上
const result = constructor.apply(obj, args);
// 3. 如果构造函数返回了一个对象,则返回该对象;否则返回新创建的对象
return result instanceof Object ? result : obj;
}本题详细解读
1. 创建新对象并设置原型
在 myNew 函数中,首先使用 Object.create(constructor.prototype) 创建一个新对象 obj,并将其原型指向构造函数的原型。这一步模拟了 new 操作符的第一步,即创建一个新对象并将其原型设置为构造函数的 prototype。
2. 调用构造函数并绑定 this
接下来,使用 constructor.apply(obj, args) 调用构造函数,并将 this 绑定到新创建的对象 obj 上。这一步模拟了 new 操作符的第二步,即调用构造函数并将 this 指向新创建的对象。
3. 处理构造函数的返回值
最后,检查构造函数的返回值 result。如果 result 是一个对象(即 result instanceof Object 为 true),则返回该对象;否则返回新创建的对象 obj。这一步模拟了 new 操作符的第三步,即根据构造函数的返回值决定最终返回的对象。
总结
通过以上步骤,myNew 函数成功地模拟了 new 操作符的行为,能够正确地创建新对象、调用构造函数并处理返回值。