1,call实现
Function.prototype.maCall=function(context){
context=context||window
let args=[...arguments].slice(1)
context.f=this
//this为调用该函数的方法,把该函数的方法挂在在context上面,在用context调用该方法,这是该方法的this就指向了context
let res=context.f(...args)
return res
}
2,apply实现
Function.prototype.myApply=function(context){
let context=context||window
context.f=this
let res
if(arguments[1]){
res=context.f(...arguments[1])
}else{
res=context.f()
}
return res
}
3,bind实现
bind有个特点,一个绑定函数也能使用new操作符创建对象:这种行为就像把原函数当成构造器。提供的 this 值被忽略,同时调用时的参数被提供给模拟函数。
Function.prototype.myBind = function(context) {
//返回一个绑定this的函数,这里我们需要保存this
const self = this
const args = [...arguments].slice(1)
//返回一个函数
return function F() {
if (this instanceof F) {
return new self (...args, ...arguments)
}
//旧的参数加新的参数
return self.apply(context, args.concat(...arguments))
}
}