标准答案
- 先创建一个空对象。
- 把这个对象的原型关联到构造函数的 prototype。
- 用新对象作为 this 调用构造函数,并传入参数。
- 如果构造函数显式返回对象或函数,就返回这个显式返回值。
- 如果构造函数没有返回对象类型,就返回前面创建的新对象。
题目解析
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 更清晰。