Function.prototype.myCall=function(obj,...rest) {
console.log(this);
if(typeof this !=='function'){//判断调用者是否是函数,不是函数不给调用
throw new TypeError('Not a function')
}
if(typeof obj==='undefined'||obj===null){
obj=window //如果第一个参数是undefined或者是null则输出window对象
}
obj=Object(obj)//如果不是对象转为对象,防止后面用点方法报错
obj.fn=this//将函数挂载到传入的对象身上
let result=obj.fn(...rest)//当以对象调用函数时,函数的this就指向了对象。这样就改变了指针
delete obj.fn//将对象身上挂载的方法删除
return result //将函数的返回结果return出去
}
查看与原方法是否成功实现
function sayName(a,b) {
console.log(this);
console.log(a+b);
}
sayName.call({},2,3)
sayName.myCall({},2,3)
查看结果
与原方法并无差别