this.apply方法,以此为参数

时间:2015-11-17 23:06:50

标签: javascript prototype this

在Douglas Crockford的书“The Good Parts”中,他以这种方式实现了数组推送方法:

Array.prototype.push = function ( ) {
  this.splice.apply(
    this,
    [ this.length, 0 ].
      concat(Array.prototype.slice.apply(arguments))
  );
  return this.length;
};

不要理解这是如何工作的。 method_name .apply与自身( this )作为参数,在代码中对应this.splice.apply;如果我使用Array.prototype.splice.apply我得不到正确的结果。

希望有人可以解释一下this.splice.apply(this, parameters)Array.prototype.splice.apply(this, parameters)

之间的区别

1 个答案:

答案 0 :(得分:1)

简短回答:this.splice.applyArray.prototype.splice功能相同。 "只有"差异是使用函数的上下文。 this.splice使用您的数组实例作为this的值,Array.prototype.splice使用Array.prototype作为this的值,这就是您需要调用它的原因在后一种情况下.apply。通过这种方式,您可以在运行时将该功能告诉this

丑陋的事实:在函数定义this内部并不引用对象Array.prototype,而是this引用的对象(在本例中是一个数组)是< Array的em> instance 。因为该对象是Array的实例,意味着它继承了Array.prototype上定义的所有属性。 Array.prototype.slice上定义了Array.prototype,因此它是您对象的实例方法,因此您可以使用this.slice调用它。以这种方式调用切片时,this引用您的对象,该对象也是一个数组。当您使用Array.prototype.slice引用切片时,this在此上下文中引用Array.prototype,这就是您需要使用.apply(arguments)调用它的原因,即{34}运行此函数和使用this = arguments&#34;。