2015-08-25 23 views
2

我在讀這本書的JavaScript的忍者的祕密「(http://jsninja.com/)和功能不知道爲什麼從其中一個例子一定的代碼塊的編碼方式類似於它。重用原型

示例(http://jsfiddle.net/3s5bopqe/3/)構建自定義數組類型(MyArray),並重用Array.prototype中的大量函數,而不實際繼承「Array」類型。

在從書具有特定名稱的一個功能是在自定義類型的原型使用此代碼

MyArray.prototype[ name ] = function() { 
     return Array.prototype[ name ].apply(this, arguments); 
    }; 

重用的例子,我相信我理解這裏發生了什麼。但是似乎沒有必要實際使用函數文字,並且明確地從Array.prototype中「應用」一個函數。以下代碼在測試設置中也可以正常工作:

MyArray.prototype[ name ] = Array.prototype[ name ]; 

我的問題是在上一個代碼塊中使用本書中的代碼是否有任何優勢?

+1

首選項。很多JS代碼,特別是JQuery,都以書籍列表的格式工作。一致性總是好的。 –

回答

4

通過使用

MyArray.prototype[ name ] = Array.prototype[ name ]; 

你實際上是複製從Array方法到您的對象(MYARRAY)。 將來,如果Array方法更改,則MyArray方法將不會更新。

通過使用

MyArray.prototype[ name ] = function() { 
     return Array.prototype[ name ].apply(this, arguments); 
    }; 

你稱爲陣列的方法。 Array對象方法中所做的更改反映在MyArray方法中。爲什麼?因爲您從未複製該方法,所以您只是借用了它(參考當前的實現)。

1

有一個重要區別,我可以看到。如果有任何關於Array.prototype有針對性的方法,你複製後他們被改變(例如應用,修復行爲填充工具)的更改將不使用MyArray.prototype[ name ] = Array.prototype[ name ];,而它會使用jsninja方法來體現。

取決於你的觀點,你會發現一個或其他行爲更加貼合。