new 运算符原理
核心原理
当代码 new Foo(...) 执行时,会发生以下事情:
- 创建一个继承自
Foo.prototype的新对象。 - 调用构造函数
Foo,并将this绑定到新创建的对象。 - 如果构造函数返回了一个对象,则该对象会成为
new表达式的结果。 - 否则,如果构造函数没有返回对象(返回原始值或无返回值),则
new表达式的结果是步骤 1 中创建的对象。
详细步骤解析
我们可以把 new 的过程拆解为如下步骤:
- 创建一个空的简单 JavaScript 对象(即
{}); - 为步骤 1 新创建的对象添加属性
__proto__,将该属性链接至构造函数的原型对象; - 将步骤 1 新创建的对象作为
this的上下文; - 如果该函数没有返回对象,则返回
this。
手写实现 (Handwriting)
在面试中,手写 new 是一个非常高频的考点。我们可以通过编写一个 myNew 函数来模拟 new 运算符的行为。
测试用例
面试要点
- 连接原型链:新对象的
__proto__需要指向构造函数的prototype。 - 改变
this指向:使用apply或call执行构造函数。 - 返回值判断:这是容易遗漏的点。构造函数可以显式返回一个对象,如果是这样,
new的结果应该是这个返回的对象,而不是新创建的实例。如果返回原始值(undefined, null, number, boolean, string, symbol),则忽略,仍然返回新实例。

