new绑定优先级高于显式绑定,会覆盖call/apply/bind指定的this,创建新实例作为this;new与显式绑定不能共存,构造调用自动屏蔽显式绑定。

当 new 绑定和显式绑定(call/apply/bind)同时出现在一个函数调用中,new 的优先级更高,它会覆盖显式绑定的 this。
new 绑定会忽略显式绑定的 this
使用 new 调用函数时,JavaScript 引擎会创建新对象,并将该对象作为 this 绑定到构造函数内部。此时,即使函数之前被 bind 过,或在调用时用了 call/apply,这些显式绑定都会被丢弃。
-
bind返回的函数如果被new调用,bind时指定的this不生效,而是生成新实例作为this -
func.call(obj)如果写成new func.call(obj)是语法错误,不能这么写;但如果是new (func.bind(obj))(),则bind的this会被忽略 - 本质原因:new 绑定是 JavaScript 构造调用的底层机制,它强制重置
this为新创建的对象
常见例子帮你理解
看这段代码:
function Foo() {
console.log(this);
}
const boundFoo = Foo.bind({ name: 'explicit' });
new boundFoo(); // 输出:Foo {}(一个新实例),不是 { name: 'explicit' }
虽然 boundFoo 是通过 bind 绑定了 { name: 'explicit' },但 new boundFoo() 仍会创建新对象,this 指向该实例,而非 bind 的对象。
立即学习“Java免费学习笔记(深入)”;
优先级顺序要记牢
JavaScript 中 this 的绑定优先级从高到低是:
- new 绑定(最高)
- 显式绑定(
call/apply/bind) - 隐式绑定(如
obj.method()) - 默认绑定(独立函数调用)
注意:new 和显式绑定不会“共存”于一次有效调用——要么是普通调用(走显式/隐式/默认),要么是构造调用(走 new),而构造调用自动屏蔽显式绑定。
实际开发中的提醒
如果你希望某个函数既能被 new 调用,又能支持显式绑定,通常需要手动判断调用方式:
- 检查
this是否是当前函数的实例(this instanceof Foo) - 或者用
new.target判断是否通过new调用 - 避免对构造函数反复
bind后再new,因为绑定的this没有意义


















