面试又被问到了new做了什么事情?

4 阅读1分钟

在 JavaScript 里,new 是个用于创建对象实例的关键字,当使用 new 调用构造函数时,会依次执行以下操作:

1. 创建新对象

new 操作符会先在内存中创建一个全新的空对象。这个新对象会继承自构造函数的原型,也就是说它会拥有构造函数原型上的属性和方法。

2. 绑定 this

把新创建的对象绑定到构造函数内部的 this 上。这样一来,在构造函数内部对 this 进行属性和方法的赋值操作,实际上都是在给新创建的对象添加属性和方法。

3. 执行构造函数

开始执行构造函数里的代码。在这个过程中,可能会对新对象进行属性的初始化,或者为其添加一些方法。

4. 返回对象

如果构造函数显式地返回了一个对象,那么 new 表达式的结果就是这个返回的对象;要是构造函数没有显式返回对象(返回 undefined 或者根本没有返回语句),则 new 操作符会返回之前创建的新对象。

展示代码

function myNew(constructor, ...args) {
  // 确保传入的 constructor 是一个函数
  if (typeof constructor !== 'function') {
    throw new TypeError('Constructor must be a function');
  }

  // 创建一个新对象,修改原型链, 将新对象的__proto__ 指向目标对象的prototype
  const newObj = Object.create(constructor.prototype);

  // 使用 apply 调用构造函数,修改this指向,将参数传递给它
  const result = constructor.apply(newObj, args);

  // 如果构造函数返回的是对象或函数,则返回该对象或函数,否则返回新创建的对象
  return result && (typeof result === 'object' || typeof result === 'function')
    ? result
    : newObj;
}