1、apply方法和call、bind方法的不同之处是它们的传参形式,前者是通过数组的方式去传参,而后者则是通过参数列表的方式传参。
2、那么bind方法和call、apply方法的不同之处是,bind 是创建一个新的函数,我们必须要手动去调用,而后者不会。
3、总之它们的共同特点就是改变this的指向,下面呢。就给大家看看我使用call以及apply方法去实现自己的bind方法。
<script>
// 利用call或者apply实现bind方法
// 在函数原型上面定义myBind方法
Function.prototype.myBind = function () {
// 判断调用它的是否为函数,不是的话就抛出错误
if (typeof this !== 'function') {
throw new TypeError('Error')
}
// 保存this的指向obj2
const _this = this;
const arg = [].shift.call(arguments); //将删除的obj1对象返回给arg接收
const args = [].slice.call(arguments); //["动物"]
return function () {
// 通过apply方法参数传的是数组
// _this.apply(arg,[].slice.call(args,[].slice.call(arguments)))
// 通过call方法传的是参数列表
_this.call(arg, ...args, ...[].slice.call(arguments))
}
}
let obj1 = {
name: "猫",
color: "red",
food: "鱼"
}
let obj2 = {
name: "狗子",
color: "yellow",
food: "骨头",
run(animal) {
console.log(`${this.name}喜欢吃${this.food}它是${animal}`);
}
}
// obj2.run('动物');//此时this指向的是obj2
// 使用新的变量接收myBInd返回的新的函数
const newF = obj2.run.myBind(obj1, "动物");//通过myBind方法改变this指向,让其指向obj1
newF();
</script>
以上就是利用call或apply实现bind方法。