重用原型的功能

时间:2015-08-25 18:26:52

标签: javascript prototype-programming

我正在阅读这本书“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);
    };

我的问题是,在最后一个代码块中使用本书中的代码是否有任何好处?

2 个答案:

答案 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方法反映更改。

根据您的观点,您可能会发现一种或另一种行为更合适。