ES6模拟实现call()

文章目录


一、模拟实现call()

先驱知识(ES6扩展操作符):

let arr = ['北京','上海','杭州'];
console.log(...arr);    // 北京 上海 杭州
function myFun(from, to) {
    console.log(...arguments);      // 北京 上海
    let array = [...arguments];
    console.log(array);     // ['北京','上海']
}
myFun('北京','上海');

代码如下:

Function.prototype.myCall = function (context) {
    context = context ? Object(context) : window;    // Object()返回一个和给定的值相对应的类型的对象。
    context.fn = this;    // 给context对象一个属性fn(称作执行函数),用来保存this值
    let args = [...arguments].slice(1);    // 选取传入的第二个及以外参数组成的新数组
    let result = context.fn(...args);    // 通过扩展运算符将选取的参数作为执行函数fn的参数,并通过变量result接收执行函数
    delete context.fn    // 删除context对象属性fn
    return result;    // 返回执行函数
}
var obj = {
    myFun(from, to) {
        console.log(this.name + '来自' + from  + '去往' + to);
    }
}
var db = {
    name: "Jim"
}
obj.myFun.myCall(db, '北京', '上海');    // Jim来自北京去往上海

运行结果Jim来自北京去往上海

解析:通过函数myFun调用myCall时,也就是obj.myFun.myCall(db, '北京', '上海'),先将db作为临时的context对象 。myCall的this值为函数myFun,即:context.fn = myFun,也就是context对象属性fn保存函数myFun,此时输出context对象有:

{ 
    fn: myFun(from, to) {
            console.log(this.name + '来自' + from  + '去往' + to);
        },
    name: 'Jim' 
};

此后,将临时的context对象db以外的参数作为执行函数fn的参数,并将该执行函数存入变量result,即:result = context.fn('北京','上海'),删除context对象属性fn,最后返回result,从而实现将函数myFun()的this指向改变为对象db

  • 7
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JV_32

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值