bind返回的函数可被new调用,此时忽略绑定的this,恢复原函数构造行为,预设参数仍与new传参合并;手写需通过this instanceof 判断调用方式以兼容new场景。

可以,但 new 的时候会忽略 bind 时指定的 this,恢复为原函数的构造行为。
bind 返回的函数能被 new 调用
bind 创建的是一个普通函数,它符合 JavaScript 对“可构造函数”的基本要求(即有 [[Construct]] 内部方法),所以语法上完全允许用 new 调用它。例如:
function Person(name) { this.name = name; }
const BoundPerson = Person.bind({ role: 'admin' });
const instance = new BoundPerson('Alice');
这段代码不会报错,instance 是一个 Person 实例,name 属性正确赋值,而 { role: 'admin' } 这个 bind 对象被忽略。
new 会覆盖 bind 绑定的 this
这是关键点:当用 new 调用 bind 出来的函数时,JavaScript 引擎会跳过 bind 设置的 this 值,转而创建新对象并把它作为 this 传入原函数。也就是说:
- bind 时传入的 context(如 { role: 'admin' })在 new 场景下完全失效
- 原函数内部的 this 指向新创建的实例对象,而非 bind 指定的对象
- 原函数若返回对象,则以该返回值为准;否则默认返回新实例
参数传递仍按规则合并
bind 预设的参数和 new 调用时传入的参数会正常拼接:
function Point(x, y, z) { this.x = x; this.y = y; this.z = z; }
const ThreeDPoint = Point.bind(null, 0); // 预设 x = 0
const p = new ThreeDPoint(1, 2); // 实际调用 Point(0, 1, 2)
结果是 p.x === 0、p.y === 1、p.z === 2 —— 预设参数和 new 传参共同生效,只是 this 不再受 bind 控制。
手写 bind 必须兼容 new 场景
真正健壮的 bind 实现要判断调用方式:如果绑定函数被 new 调用,就让 this 指向新实例;否则才使用 bind 指定的 context。常用判断方式是:
- 在返回的函数体内检查 this instanceof 绑定函数
- 成立则说明正在 new,此时用 new.target 或 instanceof 逻辑切换 this
- 不成立则走常规 apply + 预设参数流程
这正是标准 bind 行为与简单 call/apply 封装的本质区别之一。

















