js new 的实现
new 的实现原理
在 JavaScript 中,new 操作符用于创建一个用户定义的对象类型的实例或具有构造函数的内置对象类型的实例。其核心原理可以通过以下步骤模拟:
function _new(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) 确保新对象继承构造函数原型上的属性和方法。这一步替代了直接使用 {} 的简单对象创建方式。
绑定 this 并执行构造函数
通过 apply 将构造函数的 this 绑定到新对象,并传入参数。构造函数内部的 this 此时指向新对象,因此所有通过 this.xxx 赋值的属性都会挂载到新对象上。
处理构造函数返回值
若构造函数显式返回一个对象(包括数组、函数等),则直接返回该对象;否则返回新创建的对象。这一行为模拟了原生 new 操作符的逻辑。
使用示例
function Person(name) {
this.name = name;
}
Person.prototype.sayHi = function() {
console.log(`Hi, I'm ${this.name}`);
};
// 原生 new
const p1 = new Person('Alice');
p1.sayHi(); // 输出: Hi, I'm Alice
// 自定义 _new
const p2 = _new(Person, 'Bob');
p2.sayHi(); // 输出: Hi, I'm Bob
边界情况处理
若构造函数返回非对象值(如字符串、数字等),仍会返回新创建的对象:
function Test() {
return 123;
}
const obj = _new(Test);
console.log(obj instanceof Test); // true
此实现覆盖了原生 new 的核心功能,包括原型继承、this 绑定和返回值处理。实际应用中可直接替换 new 操作符验证其行为一致性。







