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

2019-08-10  本文已影响0人  BoBoCode

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来定义。

上一篇下一篇

猜你喜欢

热点阅读