主要还是看对this的指向熟不熟悉
就简单说一下call吧(可能有点乱或者理解错误,还请见谅):
传入的第一个参数是借用该方法的对象,比如obj1.say.call(obj2)
就是obj2在借用obj1.say方法,如果要自己封装的话,应该在我们封装的方法里面获得obj1.say方法并进行添加到对象obj2里调用,这里的话就是我们在原型上添加的方法里面的this
let obj1 = {
name:'zhansan',
age:12,
say(...rest){
console.log(`姓名:${this.name};年龄:${this.age};参数:${rest}`)
}
}
let obj2 = {
name:'lisi',
age:122
}
//obj1.say.call(obj2)
Function.prototype.mycall=function(obj=window,...rest){
const key = Symbol();
obj[key] = this;//最近调用该方法的对象,这里是say方法
obj[key](...rest)
delete obj[key]
}
Function.prototype.myapply = function(obj=window,arr){
if(arr&&!Array.isArray(arr)) throw new Error('传入的参数必须为数组')
const key = Symbol();
obj[key] = this;
if(arr){
obj[key](...arr);
}
else obj[key]()
delete obj[key]
}
// obj1.say.myapply(obj2,[1,2])
// obj1.say.apply(obj2,22)
//注意:bind方法需要手动调用,所以返回的应该是一个函数
Function.prototype.mybind = function(obj=window,...rest){
const that = this;
return function(){
let parmas = rest.concat(...arguments)
that.mycall(obj,parmas)
}
}
obj1.say.mybind(obj2)()