sorted_copy
函数的以下两个实现之间是否存在实质性差异(注意:只有它们的最后一行不同):
/* version 1 */
function sorted_copy ( array ) {
var extra_args = Array.prototype.slice.call( arguments, 1 );
var copy = array.slice();
return Array.prototype.sort.apply( copy, extra_args );
}
/* version 2 */
function sorted_copy ( array ) {
var extra_args = Array.prototype.slice.call( arguments, 1 );
var copy = array.slice();
return copy.sort.apply( copy, extra_args );
}
更一般地说,假设我们手头有一个变量someInstance
1 ,其值实际上是SomeType
2 的一个实例,并且args
是Array
的某个合适实例,那么何时有理由优先选择其中一个?
SomeType.prototype.someMethod.apply( someInstance, args );
someInstance.someMethod.apply( someInstance, args );
同样,如果arg1
,arg2
,...是某些值序列,何时有理由偏好以下一个或另一个?
SomeType.prototype.someMethod.bind( someInstance, arg1, arg2, ... );
someInstance.someMethod.bind( someInstance, arg1, arg2, ... );
1 假设所有其他事情都是平等的,我认为SomeType.prototype.someMethod...
形式的一个可能的好处是它们可以消除这种需要创建变量只是为了获取其someMethod
。例如,在sorted_copy
的版本1中,可以省去定义copy
变量(即函数体的第二行),然后返回Array.prototype.sort.apply( array.slice(), extra_args )
。上述规定someInstance
变量的存在应视为给定,只是出于本问题的目的,仅考虑SomeType.prototype.someMethod...
形式的这种小的可能利益。
2 当然,不言而喻,方法someInstance.someMethod
是因为SomeType
的实例而继承的方法,否则这个帖子是问题变得微不足道。
答案 0 :(得分:1)
Array.prototype.sort.
和someArray.sort.
(注意尾随点)完全相同,所以没有区别。 Array.prototype.sort()
和someArray.sort()
不同,但这是另一个问题。
出于性能原因,使用Array.prototype
可能更好,因为您可以将其缓存在命名空间中,例如, underscore sources