美文网首页
call()和apply()函数的实现详解

call()和apply()函数的实现详解

作者: BoBoCode | 来源:发表于2019-08-10 01:01 被阅读0次

    call与apply都属于Function.prototype的一个方法,所以每个function实例都有call、apply属性;

    作用:
    call()方法和apply()方法的作用相同:改变this指向。
    继承

    区别:
    穿的参数不一样

    模拟实现call()函数:

    //双参数实现
    Function.prototype.newCall = function (context,...params) {
        if (typeof context === 'object') {
            context = context || window
        } else {
            context = Object.create(null);
        }
        let fn = Symbol();//es6 symbol()表示唯一值;作为属性的时候,不能使用点运算符
        context[fn] = this;
        var result = context[fn](...params);
    
        delete context[fn];
        return result;
    }
    

    模拟实现apply()函数:

    //apply()函数的双参数实现
    Function.prototype.newApply = function(context, parameter) {
      if (typeof context === 'object') {
        context = context || window
      } else {
        context = Object.create(null)
      }
      let fn = Symbol()
      context[fn] = this;
      var result = context[fn](...parameter);
      delete context[fn];
      return result;
    }
    

    Symbol是由ES6规范引入的一项新特性,它的功能类似于一种标识唯一性的ID。通常情况下,我们可以通过调用Symbol()函数来创建一个Symbol实例:

    let s1 = Symbol()
    

    由于Symbol是一种基础数据类型,所以当我们使用typeof去检查它的类型的时候,它会返回一个属于自己的类型symbol;

    每个Symbol实例都是唯一的。因此,当你比较两个Symbol实例的时候,将总会返回false;

    每个Symbol实例都是唯一的。因此,当你比较两个Symbol实例的时候,将总会返回false;

    Symbol类型的key是不能通过Object.keys()或者for...in来枚举的,它未被包含在对象自身的属性名集合(property names)之中。所以,利用该特性,我们可以把一些不需要对外操作和访问的属性使用Symbol来定义。

    相关文章

      网友评论

          本文标题:call()和apply()函数的实现详解

          本文链接:https://www.haomeiwen.com/subject/dlqljctx.html