call、apply和bind这三个一直是我们js中非常常用的继承,接下来我将自己从大佬学习的一些经验分享一下。
谈谈三者的异同点
相同点:都是为改变this指向而存在的。
异同点: 使用call()方法时,传递给函数的参数必须逐个列举出来,
使用apply()方法时,传递给函数的是参数数组。
bind()和call()很相似,第一个参数是this的指向,从第二个参数开始是接收的参数列表。
bind() 方法不会立即执行,而是返回一个改变了上下文 this后的函数,用于稍后调用。 call()、apply()则是立即调用。
手写myCall myApply myBind
Function.prototype.myCall=function(context){
context = context|| window
context.fn=this
let arg = [...arguments].slice(1)
let result = context.fn(...arg)
delete context.fn
return result
}
Function.prototype.myApply = function(context){
context = context||window
context.fn=this
let arg = arguments[1]||[]
let result=context.fn(...arg)
delete context.fn
return result
}
Function.prototype.myBind=function(context){
let _this=this
let arg=[...arguments].slice(1)
return function fn(){
return _this.apply(context,arg.contact(...arguments))
}
}