手写 bind 方法需返回新函数,绑定 this 并预置参数,且支持 new 调用:通过闭包保存原函数、上下文和预置参数;调用时用 apply 绑定 this 并合并参数;new 调用时以 object.create 设置原型并忽略绑定 this。

手写 bind 方法,核心是模拟原生 Function.prototype.bind 的行为:返回一个新函数,绑定指定的 this 上下文,并可预设部分参数(柯里化),且支持作为构造函数调用(此时绑定的 this 被忽略)。
基础功能:绑定 this 和预置参数
先实现最核心能力:调用 fn.bind(obj, a, b) 返回一个函数,当它被调用时,this 指向 obj,且自动传入 a、b 作为前几个参数。
关键点:
- 用闭包保存目标函数、绑定对象和预置参数
- 返回的函数执行时,用
apply或call显式绑定this并合并参数
处理构造函数调用场景
原生 bind 返回的函数可以被 new 调用。此时,即使绑定了 this,实例的原型链仍需指向原函数的 prototype,且绑定的 this 不生效。
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
实现方式:
- 在返回函数内部判断是否通过
new调用(检查this是否是返回函数的实例) - 如果是,用
Object.create设置新实例的原型为原函数的prototype,并用apply执行原函数 - 如果不是,正常绑定
this并调用
完整可运行的手写 bind
以下是一个符合规范的实现:
Function.prototype.myBind = function (context, ...args) {
if (typeof this !== 'function') {
throw new TypeError('Bound function must be callable');
}
const fn = this;
const boundFn = function (...callArgs) {
// 判断是否作为构造函数调用
const isConstructing = this instanceof boundFn;
const finalThis = isConstructing ? this : context;
return fn.apply(finalThis, args.concat(callArgs));
};
// 保证 new boundFn() 的实例能正确继承原函数原型
boundFn.prototype = Object.create(fn.prototype);
return boundFn;
};
注意:boundFn.prototype = Object.create(fn.prototype) 这一步不能省略,否则 new 出来的实例无法访问原函数原型上的方法。
小细节与兼容性说明
原生 bind 还有一些细节,比如返回函数有 length 属性(等于原函数形参个数减去预置参数个数),以及函数名显示为 "bound XXX"。这些属于非必需特性,日常手写一般不深究;若需完全模拟,可用 Object.defineProperty 设置 length,或用 Function 构造器动态生成函数名(但较复杂,实际项目中直接用原生即可)。










