原文地址:https://www.cnblogs.com/veinyin/p/13541651.html
在学习 this 指向时,我们知道如果一个函数作为对象的方法执行时,this 指向这个对象
那么实现 call 可以参考这个思路
1. 在对象上添加函数
2. 执行对象方法
3. 删除为了改变 this 而在对象上添加的函数
实现如下
1 // 这里要用 function 不能用箭头函数,要通过 this 获取调用 myCall 的函数 2 Function.prototype.myCall = function (ctx, ...args) { 3 // ctx 是要设置的 this,没传或传入 null,就设为 window 4 ctx = ctx || window 5 6 // 1. 在对象上添加函数. fn.myCall() 形式调用,可以看出在 myCall 中 this 就是 fn 7 ctx.callFunc = this 8 9 // 2. 执行对象方法. 保留执行结果用于返回 10 const result = ctx.callFunc(...args) 11 12 // 3. 删除添加的函数 13 delete ctx.callFunc 14 15 // 4. 返回执行结果 16 return result 17 }
以上实现还有优化空间,比如假如已经存在 callFunc 属性怎么办,可以取一个唯一的名字,比如 Symbol、随机数、随机字符串、时间戳等等