new绑定优先级最高,因其在函数执行前就将this硬绑定到新实例上,跳过后续所有绑定逻辑;new调用严格按四步执行,第三步即锁定this不可逆;显式绑定在new场景下不生效,因引擎直接进入构造模式;箭头函数不可new调用,不参与优先级竞争。

new 绑定之所以具有最高优先级,根本原因在于它发生在函数执行的最早阶段——在函数体任何一行代码运行之前,JavaScript 引擎就已经把 this 硬性绑定到了新创建的实例对象上。这不是“覆盖”其他绑定,而是直接跳过后续所有绑定逻辑。
new 操作内部四步中第三步就锁定 this
每次 new 调用都严格按以下顺序执行:
- 创建一个空对象(即即将返回的实例)
- 将该对象的 __proto__ 链接到构造函数的 prototype
- 把 this 明确指向这个新对象(关键一步,此时函数还没开始执行)
- 执行构造函数体,并根据返回值决定最终结果(若返回非 null 对象,则丢弃新对象;否则返回新对象)
第三步完成后,this 已不可逆地绑定到新实例。后续无论函数是否被 bind 过、是否作为某个对象的方法调用,都不会再重新计算 this。
显式绑定无法在 new 场景下生效
call/apply/bind 的作用是“在普通调用时强制指定 this”,但 new 调用不走普通调用路径。引擎识别到 new 关键字后,会进入构造模式,绕过显式绑定的介入时机。
- const bound = fn.bind({x: 1}); new bound(); → this 是新实例,不是 {x: 1}
- const obj = { method: fn }; new obj.method(); → this 仍是新实例,不是 obj
注意:箭头函数不能被 new 调用,语法报错,所以天然不参与 this 优先级竞争。
优先级高 = 执行时机早,而非“更强力”
所谓“最高优先级”,本质是 JavaScript 引擎的执行流程决定的:它按固定顺序检查调用方式,一旦匹配 new,立即应用 this 绑定并终止后续判断。不是它“赢了” bind 或 call,而是 bind/call 根本没机会运行。
- 判断顺序:先看有没有 new → 再看有没有 call/apply/bind → 最后才看是否是 obj.fn() 形式
- 这种顺序设计保证了构造行为的确定性:你总能预期 new Foo() 中的 this 就是新实例,不会因外部绑定而意外改变
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











