思路
1. 给目标对象创建一个属性,将要调用的方法绑定到这个属性上
2.通过arguments取出除第一位之外的所有参数放到一个数组里,然后通过展开运算符给要执行的函数或方法传参
3.直接运行刚刚创建的属性
4.删除这个属性
5.这样就间接绑定了this的指向,并实现了call
原文
Function.prototype.mycall = function(obj){ // 给Function的原型对象上加上mycall方法
obj = new Object(obj) || window || global
obj.fn = this // 给目标对象新建一个属性,绑定这个函数
let paramsArr = new Array() // 新建一个空数组
for(let i = 1; i < arguments.length; i++){
paramsArr.push(arguments[i])
}
obj.fn(...paramsArr) // 运行一下
delete obj.fn // 删除目标对象上的fn属性
}
function test(p1,p2,p3){ // 定义函数
console.log(this.num1,this.num2,p1,p2,p3)
}
test.call(1,2,3) // 原生call undefined undefined 2 3 undefined
test.mycall(1,2,3) // 实现的call undefined undefined 2 3 undefined