实现简版 call

原文地址: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、随机数、随机字符串、时间戳等等

 

posted @ 2020-08-21 16:16  yuhui_yin  阅读(119)  评论(0编辑  收藏  举报