背景
前两天正在面试,面试官问了我一个问题差点没答上来这里总结一下。
在 JavaScript 中,new操作符主要做了以下几件事情:
-
创建一个新的空对象。
-
将这个新对象的原型设置为构造函数的原型。
-
执行构造函数,将
this绑定到新创建的对象上,并可以传入参数。 -
如果构造函数返回一个对象,则返回这个对象;否则,返回新创建的对象。
以下是手写一个模拟new操作符的函数:
function myNew(constructor,...args) {
// 创建一个新对象
const obj = {};
// 将新对象的原型设置为构造函数的原型
Object.setPrototypeOf(obj, constructor.prototype);
// 执行构造函数,将 this 绑定到新对象上,并传入参数
const result = constructor.apply(obj, args);
// 如果构造函数返回一个对象,则返回这个对象;否则,返回新创建的对象
return typeof result === 'object' && result!== null? result : obj;
}
使用示例:
function Person(name, age) {
this.name = name;
this.age = age;
}
Person.prototype.sayHello = function() {
console.log(`Hello, I'm ${this.name}, ${this.age} years old.`);
};
const person = myNew(Person, 'Alice', 30);
person.sayHello();
在上述代码中,myNew函数模拟了new操作符的行为,创建了一个新的对象,并执行了构造函数,最后返回新创建的对象或构造函数返回的对象。