金九银十之如何手写new?

104 阅读1分钟

背景

前两天正在面试,面试官问了我一个问题差点没答上来这里总结一下。

在 JavaScript 中,new操作符主要做了以下几件事情:

  1. 创建一个新的空对象。

  2. 将这个新对象的原型设置为构造函数的原型。

  3. 执行构造函数,将this绑定到新创建的对象上,并可以传入参数。

  4. 如果构造函数返回一个对象,则返回这个对象;否则,返回新创建的对象。

以下是手写一个模拟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操作符的行为,创建了一个新的对象,并执行了构造函数,最后返回新创建的对象或构造函数返回的对象。