apply与call共同点在于,一经调用自动执行,不同点在于传递参数的方式,call传递的是参数列表(逗号分割,依次传参),apply传递的是数组(明文要求)
那么我们就在imicall函数的基础上进行逻辑的叠加(不知道imicall函数的请到我的文章--js手撕this绑定--模拟call函数的实现查看)
既然接收的数组,那么我们就设置一个接收数组的形参。
再然后需要考虑的就是这个形参的边界了,如果它为空会如何,它为undefined或者null会如何,如果它只需要传递一个参数会如何?
所以解决办法如下:一看就懂!
Function.prototype.imiapply=function(obj,args){
if(obj!==0){
obj=obj?Object(obj):window
}else{
obj=Object(obj)
}
let fn=this
obj.fn=fn
args=args||[]
let result=obj.fn(...args)
delete obj.fn
return result
}
function sum(num1,num2){
console.log("sum:",this);
return num1+num2
}
var obj={name:'xwl'}
var result1=sum.imiapply(obj,[10])
var result2=sum.imiapply(undefined,[20,30])
var result3=sum.imiapply(obj)
console.log(result1);
console.log(result2);
console.log(result3);结果如下:

京公网安备 11010502036488号