new绑定不是语法糖,而是javascript引擎在函数调用前强制介入的初始化机制,它通过创建空对象、设置原型、重置执行上下文、返回实例四步硬性流程接管this绑定,优先级最高且不可被bind等覆盖。

new 绑定不是语法糖,而是 JavaScript 引擎在函数调用前强制介入的一套初始化机制。它让 this 指向新对象的本质,不在于“设置”,而在于“接管执行上下文”——从函数体第一行开始,this 就已确定为那个即将成型的实例。
new 调用触发四步硬性流程
当你写 new Person("Alice"),引擎不会先执行函数体,而是按固定顺序完成以下操作:
- 创建一个空对象(
{}),作为未来实例的雏形 - 将该对象的
[[Prototype]]指向Person.prototype - 以这个空对象为 this,**重新构建执行上下文**,再执行
Person函数体(即this.name = "Alice"实际写入的是这个新对象) - 若函数体未显式返回对象,则自动返回该新对象;若返回对象,则丢弃 this 实例,直接返回那个对象
为什么 this 一定指向新对象,而不是被其他绑定覆盖?
因为 new 绑定发生在函数执行的最前端——它在 call/apply/bind 或隐式调用逻辑生效之前,就完成了 this 的“硬编码”。哪怕你对构造函数做了 bind:
const boundPerson = Person.bind({ name: "ignored" });
const p = new boundPerson("Alice"); // this 仍指向新对象,bind 的参数被忽略
这说明:new 不是“修改 this”,而是“重置执行上下文的 this 绑定目标”,优先级天然最高。
构造函数内部 this 的行为验证了它的实例归属
所有在构造函数中通过 this.xxx = yyy 添加的属性和方法,最终都落在实例上,而非全局或传入对象:
-
this.name = "Alice"→p.name可访问,window.name不变 -
this.say = function(){}→p.say存在,且p.say()中的 this 仍是p(隐式绑定接力) - 若构造函数返回一个对象(如
return { custom: true }),则p就是那个对象,原始 this 实例被彻底丢弃
箭头函数无法参与 new 绑定,反向印证其机制依赖
箭头函数没有 prototype,也没有独立的 this 绑定逻辑。写 new (() => {}) 会立即报错 TypeError: xxx is not a constructor。这不是限制,而是底层机制决定的:new 绑定要求函数具备原型链可配置性、执行上下文可重定向性——只有普通函数满足。











