标准答案
- 四个步骤:先创建一个新对象;把这个新对象的内部原型指向构造函数的 prototype;用这个新对象作为 this 执行构造函数;最后根据构造函数返回值决定结果。
- 返回值规则:如果构造函数显式返回对象或函数,new 的结果就是这个返回值;如果返回原始值,或者没有返回值,就返回一开始创建的新对象。
- 可构造性:普通函数可以被 new,class 必须通过 new 调用,箭头函数没有 [[Construct]],不能被 new。
- 手写实现:核心思路是用 Object.create(Constructor.prototype) 创建实例,用 Constructor.apply(instance, args) 执行构造函数,再判断返回值是否为对象或函数。只说“new 会创建对象”不够,还要把原型连接、this 绑定和返回值规则讲完整。
题目解析
new 和原型链是连在一起的:实例能访问构造函数 prototype 上的方法,正是因为 new 建立了实例内部原型到构造函数 prototype 的连接。
如果构造函数返回对象覆盖了默认实例,那么 this 上挂的属性可能就不是最终结果的一部分。这是手写 new 和读构造函数代码时都要注意的点。
代码示例
一个核心版 myNew 可以直接对应 new 的四个步骤。
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
}
function User(name) {
this.name = name
}
const user = myNew(User, 'Alice')
user.name // Alice常见误区
- 忽略构造函数返回对象会覆盖默认实例。
- 误以为 new 只是执行函数,没有说明原型连接和 this 绑定。
- 试图 new 箭头函数。箭头函数不能作为构造函数。