bind的特点:
1.bind可以修改this指向,并且可以绑定参数
2.被bind之后的函数并不会执行,而是返回一个绑定后的函数,这个函数需要被调用才会执行
3.如果被bind之后返回的函数被new了 那么函数中的this就是new出来的实例
4.new出来的结果,可以找到原有类的原型
5.参数可以分两批传入,在调用bind时,第一个参数为要更改的this指向,后边的参数会作为新函数的参数;在新函数执行时也可以传入参数,传入的参数会放在bind时的参数之后
例子:
let obj = {
name: 's.m.d',
};
function fn(name, age) {
console.log(`${this.name}-养了一只-${name}-它今年-${age}岁了`);
}
let bindFn = fn.bind(obj, '猫');
bindFn('2'); // s.m.d-养了一只-猫-它今年-2岁了
// 参数可以分成两次传 第一次传了一个'猫',第二次传了个'2'
实现原理:
Function.prototype.bind = function (context) {
let _this = this;
let bindArgs = Array.prototype.slice.call(arguments, 1); // 先拿到bind传入参数的
// 待会儿返回这个函数,被bind过的构造函数 执行的时候 就是调用的这个函数
function fBind() {
let args = Array.prototype.slice.call(arguments);
return _this.apply(
this instanceof fBind ? this : context,
bindArgs.concat(args)
);
}
function Fn() {} // 如果被bind生成的新函数 被new的话 其中的this应该是new出来的实例
Fn.prototype = this.prototype
fBind.prototype = new Fn();
return fBind;
};