js实现new
实现 new 操作符
在 JavaScript 中,new 操作符用于创建一个用户定义的对象类型的实例或具有构造函数的内置对象的实例。以下是手动实现 new 操作符功能的步骤:
实现步骤
创建一个函数 myNew,模拟 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;
}
示例用法
定义一个构造函数:
function Person(name, age) {
this.name = name;
this.age = age;
}
Person.prototype.greet = function() {
console.log(`Hello, my name is ${this.name}`);
};
使用 myNew 创建实例:

const person = myNew(Person, 'Alice', 25);
person.greet(); // 输出: Hello, my name is Alice
console.log(person.age); // 输出: 25
关键点解析
Object.create(constructor.prototype) 创建一个新对象,并将其原型链指向构造函数的 prototype 属性,确保实例可以访问构造函数原型上的方法。
constructor.apply(obj, args) 调用构造函数,并将 this 绑定到新创建的对象,初始化对象的属性。

检查 constructor 是否返回一个对象。如果构造函数返回非对象值(如原始类型或无返回值),则返回新创建的对象;如果返回对象,则直接返回该对象。
边界情况处理
如果构造函数返回原始类型(如 null、数字、字符串等),myNew 仍然会返回新创建的对象:
function Test() {
return 42;
}
const obj = myNew(Test);
console.log(obj); // 输出: Test {},而不是 42
如果构造函数返回一个对象,则直接返回该对象:
function Test() {
return { custom: true };
}
const obj = myNew(Test);
console.log(obj); // 输出: { custom: true }
这种方法完整模拟了原生 new 操作符的行为,包括原型链继承和构造函数返回值的处理。






