new的实现 js
new 操作符的实现原理
在 JavaScript 中,new 操作符用于创建一个用户定义的对象类型的实例或具有构造函数的内置对象类型的实例。理解 new 的内部实现有助于深入掌握原型链和构造函数的工作原理。
手动实现 new 操作符
以下是手动实现 new 操作符的代码示例:

function myNew(constructor, ...args) {
// 创建一个空对象,并将其原型指向构造函数的 prototype
const obj = Object.create(constructor.prototype);
// 调用构造函数,并将 this 绑定到新创建的对象
const result = constructor.apply(obj, args);
// 如果构造函数返回了一个对象,则返回该对象;否则返回新创建的对象
return result instanceof Object ? result : obj;
}
实现步骤分解
-
创建空对象并设置原型链
Object.create(constructor.prototype)创建一个新对象,并将其[[Prototype]]指向构造函数的prototype属性。这确保了新对象能够访问构造函数原型上的方法。
-
绑定 this 并执行构造函数
constructor.apply(obj, args)将构造函数的this绑定到新创建的对象,并传入参数。构造函数内部的this此时指向新对象。 -
处理构造函数返回值
如果构造函数显式返回一个对象(包括数组、函数等),则直接返回该对象;否则返回新创建的对象。这是为了保持与原生new操作符一致的行为。
使用示例
function Person(name, age) {
this.name = name;
this.age = age;
}
Person.prototype.greet = function() {
console.log(`Hello, my name is ${this.name}`);
};
// 使用原生 new
const p1 = new Person('Alice', 25);
p1.greet(); // 输出: Hello, my name is Alice
// 使用手动实现的 myNew
const p2 = myNew(Person, 'Bob', 30);
p2.greet(); // 输出: Hello, my name is Bob
注意事项
- 如果构造函数返回原始值(如
number、string、boolean等),new操作符会忽略该返回值,仍然返回新创建的对象。 - 手动实现的
myNew函数不支持new.target特性,这是原生new操作符的一个高级特性。 - 在 ES6 类中,如果尝试不使用
new调用类构造函数会抛出错误,而手动实现的myNew无法完全模拟这种行为。
通过手动实现 new 操作符,可以更清晰地理解 JavaScript 中对象创建和原型继承的机制。






