让我们从The Good Parts一书中拿这个例子: Array.method('unshift', function () { this.splice.apply(this,[0,0].concat(Array.prototype.slice.apply(arguments))); return this;}); 为什么作者在一个地方使用this.splice而在另
Array.method('unshift', function () { this.splice.apply(this,[0,0].concat(Array.prototype.slice.apply(arguments))); return this; });
为什么作者在一个地方使用this.splice而在另一个地方使用Array.prototype.slice?
我尝试互相交换这个和Array.prototype并得到如下错误:
TypeError:无法读取未定义的属性“slice”
但我仍然不确定,如何知道何时应该使用这个或Array.prototype.
在第一次调用中,这指的是调用unshift的数组,因此它继承了Array.prototype的splice.但是,在第二次调用中,代码对不是数组的东西使用切片(参数伪数组,没有切片方法).因此,在这种情况下,Crockford通过Array.prototype访问该方法.
从技术上讲,他本可以在第二个位置使用this.slice,如下所示:
Array.method('unshift', function () { this.splice.apply(this,[0,0].concat(this.slice.apply(arguments))); return this; });
…但它可能会产生误导,因为第二次调用与此引用的当前数组无关.