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);

结果如下:
apply执行结果