new操作符的模拟需四步:1.用object.create(constructor.prototype)创建空对象并绑定原型;2.用constructor.apply(obj, args)绑定this并执行构造函数;3.若构造函数返回对象或函数则返回它,否则返回新对象;4.整合为mynew函数。
要模拟 new 操作符的行为,关键在于理解它内部实际执行的四个步骤,并用 javascript 手动还原:创建空对象、绑定原型、执行构造函数、返回正确结果。
1. 创建一个全新的空对象
这是第一步,本质是生成一个继承自构造函数 prototype 的普通对象。不能直接写 {},因为那样会丢失原型链;必须用 Object.create() 显式指定原型。
- 用
Object.create(constructor.prototype)创建新对象 - 这样确保新对象的
__proto__指向构造函数的prototype
2. 将 this 绑定到新对象并执行构造函数
构造函数内部的 this 必须指向刚创建的对象,这样才能让属性和方法挂载到它上面。需要用 call 或 apply 显式调用。
- 把新对象作为第一个参数传给
constructor.call() - 剩余参数(如果有)用扩展运算符
...args一并传入
3. 处理构造函数的返回值
这一步容易被忽略:如果构造函数显式返回了一个对象(包括数组、函数、正则等引用类型),new 会优先返回它;否则才返回新创建的对象。
- 检查
result是否为对象或函数类型且不为null - 如果是,则返回该
result;否则返回新对象
4. 完整实现 myNew
把以上三步组合起来,注意参数收集和返回逻辑:
function myNew(constructor, ...args) {
const obj = Object.create(constructor.prototype);
const result = constructor.apply(obj, args);
return (result !== null && typeof result === 'object') || typeof result === 'function'
? result
: obj;
}
你可以用它替代 new 来实例化构造函数,行为一致,比如:myNew(Person, 'Alice', 25)。










