手写 bind 的核心是运行时通过 new.target 判断调用方式:普通调用绑定 thisarg,new 调用则使用实例对象并忽略 thisarg;需手动设置 boundfn.prototype = object.create(originalfn.prototype) 以继承原型链,并支持预设参数与调用参数合并。

手写 bind 时,要让返回的绑定函数既能正常绑定 this,又能在用 new 调用时“自动退让”,关键在于**运行时判断调用方式**,并据此动态决定 this 绑定目标和原型链归属。
识别 new 调用:用 new.target 最可靠
ES6 引入的 new.target 是判断是否被 new 调用的权威依据:在函数体内,若 new.target 存在(非 undefined),说明正通过 new 实例化;否则为普通调用。不推荐仅用 this instanceof boundFn,因为该方式在函数尚未设置好原型前可能不准,且兼容性不如 new.target。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
普通调用与 new 调用的 this 分流处理
在绑定函数内部需做分支:
- 普通调用:
this使用 bind 时传入的thisArg(null/undefined时转为globalThis) -
new调用:this使用实例对象本身(即构造过程创建的新对象),忽略thisArg
必须显式继承原函数的原型
绑定函数本身不是构造函数,但它的实例必须能访问原函数的原型方法(如 instanceof、原型上定义的方法)。因此需手动设置:boundFn.prototype = Object.create(originalFn.prototype);
这步不能省略,否则 new boundFn() 创建的实例无法继承原函数原型链,instanceof 也会失效。
参数合并要支持多次传参(柯里化)
bind 支持预设参数,后续调用再补全。实现时需:
- 保存 bind 时传入的参数(
Array.from(arguments).slice(1)) - 在绑定函数执行时,将预设参数与调用时参数拼接:
preArgs.concat(Array.from(arguments)) - 注意:new 调用时,这些预设参数仍有效,只是
this不再受绑定影响
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










