码迷,mamicode.com
首页 > 移动开发 > 详细

Javascript call和apply的模拟实现

时间:2017-05-07 11:32:09      阅读:257      评论:0      收藏:0      [点我收藏+]

标签:i++   cal   分享   arguments   alt   变化   this   新特性   但我   

一、开始

我们先看下原生call做了什么事

function bar(name,age){
    this.hobby = ‘shopping‘;
    console.log(this.value);
    console.log(this.hobby);
    console.log(name);
    console.log(age);
}
bar.prototype.friend = ‘kevin‘;
var obj = {
    hobby: ‘gamming‘
}

var hah = bar.call(obj,‘jack‘,18);

输出是:

技术分享

这说明call只是修改了this的指向,没有返回对象。

二、模拟实现

所以我们只要尝试着去修改this的指向并执行就行了,不需要有返回值:

Function.prototype.calls = function(){
    var dir = arguments[0];
    var args = [];
    for(var i = 1; i < arguments.length; i++){
        args.push(arguments[i])
    };
    dir.pau = this;
    // 这里用到了ES6的新特性,不好
    dir.pau(...args);
    delete dir.pau;
}

如果不像用es6,我看别人的方法则是用了eval,但我不懂eval……

 eval(‘dir.pau(‘ + args +‘)‘);
 delete dir.pau;

三、apply

apply只是把call一个一个参数传递的形势变成直接传递一个数组而已,并没有多大变化,这里就不继续写了

Javascript call和apply的模拟实现

标签:i++   cal   分享   arguments   alt   变化   this   新特性   但我   

原文地址:http://www.cnblogs.com/lastnigtic/p/6819657.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!