如何实现一个bind函数?
在 JavaScript 中,bind
函数用于创建一个新的函数,该函数在调用时,其 this
关键字被指定为 bind
的第一个参数,而其余参数将作为新函数的参数传入。 要实现一个与官方 bind
函数一样的功能,要需要解决以下几个问题:
this
的绑定- 返回一个新函数
- 函数返回值问题
- 支持
new
操作符调用绑定函数
以下是实现思路:
- 利用原型和原型链的知识,我们知道自定义
bind
函数需要在Function
的原型上进行定义。 - 函数参数问题,第一个参数为绑定的
this
,可以设置为context
;第二个参数为绑定的参数,由于函数的参数是可变参数,有可能没有,也有可能有很多个,所以使用...args
来获取参数。 - 返回一个新函数,使用
return function
,并且使用apply
将this
指向context
,并且将参数合并,将函数的返回值返回。 - 支持 new 操作符调用绑定函数,使用
new.target
来判断是否是通过 new 调用,如果是,则使用new
创建一个新对象,并且将参数合并,将函数的返回值返回。
Function.prototype.myBind = function (context, ...args) {
const fn = this; // 这里的this就是调用myBind的函数
return function (...innerArgs) {
// 判断是否是通过new调用 new.target会指向new的函数,否则为undefined
if (new.target) {
return new fn(...args, ...innerArgs);
}
// 使用apply,将this指向context,并且将参数合并,将函数的返回值返回
return fn.apply(context, [...args, ...innerArgs]);
};
};
测试
function fn(a, b, c) {
console.log(this);
return a + b + c;
}
const newFn = fn.myBind({ value: 1 }, 1, 2);
console.log(newFn(3));
console.log(new newFn(3));