关键词:模拟 new
可以使用以下代码来模拟new操作:
function myNew(constructor, ...args) {
// 创建一个新对象,该对象继承自构造函数的原型
const obj = Object.create(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, my name is ${this.name} and I'm ${this.age} years old.`);
}
const john = myNew(Person, "John", 25);
john.sayHello(); // 输出:Hello, my name is John and I'm 25 years old.在上述代码中,myNew函数模拟了new操作的过程:
- 首先,通过
Object.create创建了一个新对象obj,并将构造函数的原型对象赋值给该新对象的原型。 - 然后,使用
apply方法调用构造函数,并传入新对象obj作为this值,以及其他参数。 - 最后,根据构造函数的返回值判断,如果返回的是一个非空对象,则返回该对象;否则,返回新创建的对象
obj。
这样,我们就可以使用myNew函数来模拟new操作了。