new 的核心行为包括四步:1.用Object.create(Constr.prototype)创建对象并关联原型;2.用Constr.apply(obj, args)绑定this并执行构造函数;3.若构造函数返回非null对象则返回它,否则返回新对象;4.该逻辑完整复现原生new行为。

可以手动模拟 new 的核心行为:创建新对象、绑定原型、执行构造函数、返回正确值。关键在于理解 new 做了四件事,缺一不可。
1. 创建空对象并关联原型
用 Object.create(Constr.prototype) 创建一个新对象,并让它的 __proto__ 指向构造函数的 prototype,这样才能继承原型上的方法和属性。
2. 绑定 this 并执行构造函数
用 Constr.apply(obj, args) 把构造函数的 this 指向新对象,并传入参数。注意不能直接调用 Constr(...),否则 this 会指向全局或 undefined(严格模式)。
3. 处理构造函数的返回值
如果构造函数显式返回了一个**对象类型**(包括函数、数组、正则等),就以该返回值为准;否则返回新创建的对象。需用 typeof 和 === null 判断是否为对象且非 null。
4. 完整实现示例
以下是可直接使用的自定义 myNew 函数:
function myNew(Constr, ...args) {
// 1. 创建新对象,关联原型
const obj = Object.create(Constr.prototype);
// 2. 执行构造函数,绑定 this
const result = Constr.apply(obj, args);
// 3. 判断返回值:是对象(且不为 null)则返回它,否则返回 obj
if (result !== null && typeof result === 'object') {
return result;
}
return obj;
}
使用方式与 new 一致:
function Person(name) {
this.name = name;
}
Person.prototype.say = function() {
return `Hi, I'm ${this.name}`;
};
const p = myNew(Person, 'Alice');
console.log(p.name); // 'Alice'
console.log(p.say()); // 'Hi, I'm Alice'
注意:若构造函数返回原始值(如字符串、数字、undefined),myNew 仍会返回新对象;只有返回对象才被采纳——这和原生 new 行为完全一致。


















