硬绑定函数被 new 调用时,this 会被引擎主动重置为新实例对象;这是因 new 绑定优先级高于显式绑定,引擎跳过 [[boundthis]] 直接执行构造流程,确保绑定函数仍可作为构造器使用。

硬绑定函数被 new 调用时,this 确实会被重置——这不是“失效”,而是 JavaScript 引擎按规范主动介入、覆盖原有绑定的正常行为。关键在于理解这个过程不是 bug,而是 new 绑定优先级高于显式绑定的必然结果。
new 调用触发引擎底层重绑机制
当一个 bind 生成的函数被 new 执行时,引擎不会先执行 bind 预设的 this,而是直接跳过所有已有绑定,在函数体执行前就创建新对象,并把 this 指向它。这个动作发生在调用栈最顶层,早于任何用户代码运行。
- bind 返回的是 exotic function object(怪异函数对象),它内部携带了预设的
thisArg和参数列表,但这些只是“备用配置” -
new操作符会检查目标函数是否具有 [[Construct]] 内部方法;若具备,就忽略其绑定状态,强制走构造流程 - 此时函数内部的
this不再是 bind 传入的对象,而是新分配的空实例,后续属性赋值(如this.name = name)都落在该实例上
重绑过程中的 this 演变路径
以 const bound = original.bind(obj) 为例,当执行 new bound('Alice') 时,this 经历三个明确阶段:
-
阶段一(调用前):引擎识别
bound是绑定函数,读取其内部 [[BoundThis]] 属性(即obj) -
阶段二(new 初始化):引擎忽略 [[BoundThis]],新建普通对象,并将
this指向该对象;同时设置原型链(__proto__指向原函数的prototype) -
阶段三(执行中):
original函数体运行,this已是新实例,所有赋值操作都作用于它,而非obj
为什么这是设计而非缺陷
如果 new 不覆盖 bind,就无法让绑定函数真正充当构造器——比如封装带默认参数的工厂函数时,你既需要预设部分参数,又希望产出独立实例。这种分离正是 bind + new 的协作价值所在。
- bind 解决“调用时上下文稳定”,new 解决“实例化时对象隔离”,二者职责不同
- 箭头函数没有 [[Construct]],所以不能被 new 调用;而 bind 函数保留了原函数的可构造性,这是有意为之的能力保留
- ECMAScript 规范明确要求:对绑定函数执行 new 时,“the this value is the newly created object”,不查 [[BoundThis]]
验证与边界观察
可通过返回值和实例关系确认重绑发生:
- 若
original构造函数有return this或无 return,则new bound(...)返回新实例,且instanceof original为true - 若
original显式返回非空对象,则 new 结果是该返回值,但this在函数体内仍指向新对象(只是被丢弃) - 尝试
bound.call(otherObj)仍会使用 bind 时的obj,证明 new 是唯一能绕过 bind 的调用方式











