关键词:模拟 new

可以使用以下代码来模拟new操作:

 1function myNew(constructor, ...args) {
 2    // 创建一个新对象,该对象继承自构造函数的原型
 3    const obj = Object.create(constructor.prototype);
 4    
 5    // 调用构造函数,并将新对象作为this值传递进去
 6    const result = constructor.apply(obj, args);
 7    
 8    // 如果构造函数返回一个对象,则返回该对象,否则返回新创建的对象
 9    return typeof result === 'object' && result !== null ? result : obj;
10}

使用示例:

 1function Person(name, age) {
 2    this.name = name;
 3    this.age = age;
 4}
 5
 6Person.prototype.sayHello = function() {
 7    console.log(`Hello, my name is ${this.name} and I'm ${this.age} years old.`);
 8}
 9
10const john = myNew(Person, "John", 25);
11john.sayHello(); // 输出:Hello, my name is John and I'm 25 years old.

在上述代码中,myNew函数模拟了new操作的过程:

  1. 首先,通过Object.create创建了一个新对象obj,并将构造函数的原型对象赋值给该新对象的原型。
  2. 然后,使用apply方法调用构造函数,并传入新对象obj作为this值,以及其他参数。
  3. 最后,根据构造函数的返回值判断,如果返回的是一个非空对象,则返回该对象;否则,返回新创建的对象obj

这样,我们就可以使用myNew函数来模拟new操作了。

个人笔记记录 2021 ~ 2025