new 会覆盖 bind 指定的 this,但预设参数仍生效;new 调用时 this 指向新实例,bind 的 context 被忽略,预设参数与 new 实参合并,且原型链保持完整。

可以,但 new 会覆盖 bind 指定的 this,而预设参数依然生效。这是 bind 函数一个关键但容易被忽略的特性。
new 调用时 this 指向新实例,bind 的 context 被忽略
当用 new 调用 bind 返回的函数时,JavaScript 引擎会跳过 bind 绑定的 this 值,转而创建一个新对象,并将该对象作为 this 传入原函数:
- bind 时传入的上下文(如
{ role: 'admin' })完全不起作用 - 原函数内部的
this指向新构造的实例,不是 bind 指定的对象 - 如果原函数显式返回一个对象,则以该返回值为准;否则默认返回新实例
预设参数仍与 new 传参合并
bind 设置的参数不会被 new 覆盖,而是与 new 调用时传入的实参按顺序拼接:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
function Point(x, y, z) { this.x = x; this.y = y; this.z = z; }-
const ThreeDPoint = Point.bind(null, 0);→ 预设x = 0 -
new ThreeDPoint(1, 2)→ 实际调用Point(0, 1, 2) - 结果:
p.x === 0、p.y === 1、p.z === 2
手写 bind 必须兼容 new 场景
健壮的 bind 实现需判断调用方式,核心是通过 this instanceof 绑定函数 区分普通调用和构造调用:
- 若成立,说明正被
new调用,此时应让this指向新实例,而非 bind 的 context - 需手动设置
result.prototype = Object.create(this.prototype),确保原型链可继承 - 简单用
apply封装无法处理 new 场景,会破坏构造行为
原型方法仍可正常使用
bind 返回的函数保留原函数的原型链,因此构造出的实例能访问原函数原型上的方法:
function Person(name) { this.name = name; }Person.prototype.say = function() { console.log(this.name); };const BoundPerson = Person.bind({ fake: true });-
const p = new BoundPerson('Alice');→p.say()正常输出Alice
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










