new绑定优先级最高,因为引擎首先检查是否为new调用,若是则直接将this指向新实例并终止后续绑定流程,完全跳过显式绑定、隐式绑定和默认绑定。

因为 new 绑定是 JavaScript 引擎在函数调用前最先检查的规则,一旦识别出 new 调用,就直接跳过所有其他绑定逻辑,强制将 this 指向新创建的实例对象 —— 这是语言底层机制决定的,不是靠“覆盖”或“重写”,而是根本不会进入显式绑定的处理流程。
new 调用会绕过 call/apply/bind 的执行路径
JavaScript 规范规定:new 调用和 call/apply 无法共存。你不能写 new fn.call(obj) 或 new fn.apply(obj, []),语法直接报错。这意味着两者属于互斥的调用模式,引擎在解析调用时先判断是不是 new,是就走构造器路径,否则才考虑是否用了 call/apply/bind。
bind 返回的函数虽然“记得”原始绑定对象,但只要被 new 调用,引擎就会忽略那个记忆,按构造逻辑新建对象并把 this 指向它。
bind 函数被 new 调用时,this 自动失效
这是最直观的验证方式:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
const bound = foo.bind({x: 1}); bound();→ this 是{x: 1} -
const inst = new bound(42);→ this 是新实例(inst),inst.x是undefined,inst.a(如果 foo 内有this.a = 42)才是42
也就是说,bind 的“永久绑定”只对普通调用有效;遇到 new,它不生效,不是被“覆盖”,而是被“跳过”。
优先级本质是引擎处理顺序,不是叠加效果
很多人误以为“优先级高 = 后执行能改掉前面的结果”,但 this 绑定不是这样工作的。它是一次性决策:
- 第一步:是不是 new?→ 是,this = 新实例,结束
- 第二步:是不是 call/apply/bind?→ 是,this = 显式传入对象,结束
- 第三步:是不是 obj.method()?→ 是,this = obj
- 第四步:以上都不是 → 默认绑定
没有“先绑再改”,只有“先判后定”。new 在第一步就截断了后续所有判断,所以它天然最高。
箭头函数是例外,但不影响这个排序
箭头函数不参与这四条规则,它的 this 始终继承外层作用域,且不可被任何方式修改。但它和 new/显式绑定不冲突 —— 因为箭头函数本身不能用 new 调用(会报错),也不会响应 call/apply/bind 对 this 的设置。所以它不在这个优先级链里,也不动摇 new > 显式绑定的结论。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










