标准答案

  1. 先创建一个空对象。
  2. 把这个对象的原型关联到构造函数的 prototype。
  3. 用新对象作为 this 调用构造函数,并传入参数。
  4. 如果构造函数显式返回对象或函数,就返回这个显式返回值。
  5. 如果构造函数没有返回对象类型,就返回前面创建的新对象。

题目解析

new 的关键不是“调用构造函数”这一件事,而是对象、原型和返回值规则一起生效。实例能访问构造函数 prototype 上的方法,靠的是原型关联。

返回值规则也容易漏。构造函数如果返回基本类型,这个返回值会被忽略;如果返回对象或函数,new 表达式会返回这个对象。

真实 JavaScript 里还要考虑构造函数必须可构造、class 不能随便用 apply 调用等细节。面试手写题通常关注核心语义,但回答时可以说明这是简化实现。

代码示例

简化版 myNew 可以覆盖普通构造函数的核心行为。

JavaScript
function myNew(Constructor, ...args) {
  const instance = Object.create(Constructor.prototype)
  const result = Constructor.apply(instance, args)
  const isObject = result !== null && (typeof result === 'object' || typeof result === 'function')

  return isObject ? result : instance
}

常见误区

  • 只调用构造函数,忘记把实例原型指向 Constructor.prototype。
  • 不处理构造函数显式返回对象的情况。
  • 把 __proto__ 当成唯一写法,忽略 Object.create 更清晰。

作者信息