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

  • 相关阅读:
    pandas isin 和not in
    游戏开发需要学什么?
    打开页面,数字会自增的效果怎么弄?
    jq 导航栏点击添加/删除类(a标签跳转页面)
    bootstrap+jq分页
    2020/12/18
    2020/12/17
    2020/12/16
    2020/12/15
    2020/12/14
  • 原文地址:https://www.cnblogs.com/lastnigtic/p/6819657.html
Copyright © 2011-2022 走看看