在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)
答案 0 :(得分:1)
简短回答:this.splice.apply
和Array.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;。