2013-09-01 35 views
0
var primes=[2,3,5,7] 
primes.sync = function(){this[0]=23;} 

primes // => [2, 3, 5, 7] 

primes.sync() 

primes // => [23, 3, 5, 7] 

這似乎在Chrome中完美運行。將功能附加到陣列上

是否有任何理由不使用此語法/「功能」?另外,我可以指望primes表現爲普通數組(例如,將它傳遞給需要數組的函數)嗎?


這就是爲什麼我要使用它:

說我在我的程序peopleList。遍佈應用程序的函數將像使用數組一樣使用它。然後,突然,我做了一個POST到服務器。然後我希望數組直接查詢服務器,並自行更新。這將允許我的angular.js應用程序中的一些非常優雅的代碼。

回答

3

那麼就要將是,如果你(錯誤地)試圖用for-in遍歷數組唯一的麻煩。只要您使用for語句或其中一個數組迭代器方法將枚舉約束爲數字索引,就不會有任何問題。

陣列將繼續表現得像一個典型的陣列。

+0

和式循環應該避免陣列迭代反正。不能保證返回的密鑰的順序。 –

+0

@MattGreer:同意。 – user2736012

+0

我**總是**使用'.forEach'或'.map' - 這是實現它的功能性方式。因爲我使用'sugar.js'(順便說一句,這是一個很棒的圖書館),所以'for-in'對我來說已經很危險了。 – kornfridge

0

,你會想要做的是增加一個功能應用到Array.prototype,而不是將它添加到數組實例。見下文。

Array.prototype.sync = function(){this[0]=23;}; 

這樣一來,所有的數組的情況下,包括那些已加入該功能之前被初始化,將自動能夠同時使用的功能。

var a = []; 

a.sync(); // TypeError: Object [object Array] has no method 'sync' 

Array.prototype.sync = function(){this[0]=23;}; 

a.sync(); 
a // [23] 

var b = [1,2,3]; 
b.sync(); 

b // [23, 2, 3] 

然而,只添加那些有用/有意義的/可重複使用的應用到Array.prototype,因爲這將是可供有史以來所有陣列實例,將創建功能。

如果你的功能是要由只有少數情況下使用。你最好將它們添加到每個實例,就像你上面做的那樣。