zoukankan      html  css  js  c++  java
  • Javascript call和apply的模拟实现

    一、开始

    我们先看下原生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一个一个参数传递的形势变成直接传递一个数组而已,并没有多大变化,这里就不继续写了

  • 相关阅读:
    PKU 3984 迷宫问题
    九度 1341 艾薇儿的演唱会
    九度 1335
    SDUT 1198 鞍点计算
    POJ 1363 Rails
    SDUT 1570 C旅行
    HDU 1042 N!
    SDUT 1568 俄罗斯方块
    HDU 1257 最少拦截系统
    POJ 3750 小孩报数问题
  • 原文地址:https://www.cnblogs.com/lastnigtic/p/6819657.html
Copyright © 2011-2022 走看看