js手写new实现过程
手写实现 new 操作符
在 JavaScript 中,new 操作符用于创建一个用户定义的对象类型的实例或具有构造函数的内置对象的实例。以下是手动实现 new 操作符的核心逻辑:
function myNew(constructor, ...args) {
// 创建一个新对象,并将其原型指向构造函数的 prototype
const obj = Object.create(constructor.prototype);
// 调用构造函数,并将 this 绑定到新创建的对象
const result = constructor.apply(obj, args);
// 如果构造函数返回了一个对象,则返回该对象;否则返回新创建的对象
return typeof result === 'object' ? result : obj;
}
实现步骤解析
-
创建新对象并设置原型
使用Object.create()创建一个新对象,并将该对象的__proto__指向构造函数的prototype属性。这一步模拟了new操作符的原型链继承机制。 -
绑定 this 并执行构造函数
通过apply调用构造函数,将新创建的obj作为this上下文传入。构造函数内部的this会指向新对象,从而实现对属性的初始化。 -
处理构造函数返回值
如果构造函数显式返回一个对象(包括数组、函数等),则直接返回该对象;否则返回新创建的obj。这一步确保实现与原生new行为一致。
使用示例
function Person(name, age) {
this.name = name;
this.age = age;
}
const p1 = new Person('Alice', 25);
const p2 = myNew(Person, 'Bob', 30);
console.log(p1); // Person { name: 'Alice', age: 25 }
console.log(p2); // Person { name: 'Bob', age: 30 }
console.log(p2 instanceof Person); // true
注意事项
- 如果构造函数返回基本类型(如
number、string),new操作符会忽略返回值,仍返回新对象。手动实现需通过typeof result === 'object'判断。 - 手动实现的
myNew不包含完整的错误处理(如构造函数非函数的校验),实际使用时可补充。






