我正在阅读这本书“JavaScript忍者的秘密”#39; (http://jsninja.com/)并且想知道为什么来自其中一个示例的某个代码块被编码为它。
示例(http://jsfiddle.net/3s5bopqe/3/)构建自定义数组类型(MyArray)并重用Array.prototype中的许多函数,而不实际继承自'数组'类型。
在本书的示例中,使用此代码在自定义类型的原型中重用具有特定名称的函数
${services[services.type?seq_index_of(22)].name}
我相信我明白这里会发生什么。但我似乎没有必要实际使用函数文字并明确地应用' Array.prototype中的一个函数。以下代码在测试设置中也起作用:
MyArray.prototype[ name ] = function() {
return Array.prototype[ name ].apply(this, arguments);
};
我的问题是,在最后一个代码块中使用本书中的代码是否有任何好处?
答案 0 :(得分:4)
使用
MyArray.prototype[ name ] = Array.prototype[ name ];
您实际上是将Array中的方法复制到对象(MyArray)中。 将来,如果Array方法更改,则不会更新MyArray方法。
使用
MyArray.prototype[ name ] = function() {
return Array.prototype[ name ].apply(this, arguments);
};
你提到了Array方法。在Array对象方法中所做的更改将反映在MyArray方法中。为什么?因为您从未复制过该方法,所以您只是借用它(参考其当前实现)。
答案 1 :(得分:1)
我可以看到一个主要的区别。如果Array.prototype
上的任何目标方法在复制之后都会被更改(例如应用修复行为的填充),则使用MyArray.prototype[ name ] = Array.prototype[ name ];
时将不会使用jsninja方法反映更改。
根据您的观点,您可能会发现一种或另一种行为更合适。