2012-02-10 13 views
5

Ho creato un'applicazione JavaScript con molte manipolazioni di array (ordinamento, filtro, ecc.).Posso creare il mio oggetto array in JavaScript?

Attualmente le mie funzioni sono come questo:

function (myArray, arg1, arg2,...) 

dove myArray è la matrice sto lavorando su, e arg1, arg2, ... sono gli argomenti utilizzati dalla funzione di modificare l'array.

Sto pensando che sarebbe stato più ordinato di avere una chiara separazione tra l'oggetto e gli argomenti (alla jQuery):

myArray.function(arg1, arg2,...) 

So che potrei usare Array.prototype per aggiungere la mia funzione di tutti gli array, ma questo sembra troppo pesante in quanto le funzioni che aggiungo sono specifiche del mio caso e non hanno senso sugli array in generale. So anche che potrei creare un oggetto, ma in questo caso non trarrai alcun vantaggio dai metodi di array disponibili in JavaScript (indexOf, filter, ecc.).

C'è un modo per creare il mio oggetto array, che eredita i metodi di array predefiniti e mi consente di aggiungere il mio?

+3

continuare a utilizzare la funzione, è non ho bisogno di tutto oop – dynamic

+0

Giusto, ma mi piace quanto è pulito, ad esempio per concatenare o definire opzioni/argomenti predefiniti. – Christophe

risposta

8

Hai due opzioni:

L'opzione 1 consiste nell'estendere l'oggetto Array aggiungendo nuovi metodi:

Array.prototype.myMethod = function(arg1, arg2) 
{ 
    // Use 'this' to access the array. 
} 

Il vantaggio è che ogni array di javascript ora avrà questo metodo in più. Questo può anche essere uno svantaggio quando più librerie javascript (esterne) cercano di aggiungere gli stessi metodi. Inoltre, questo nuovo metodo apparirà nei costrutti for(var item in myArray) che possono essere problematici.

L'opzione due è quello di creare un "metodo factory" per l'array estesa:

function MyExtendedArray = function() 
{ 
    var array = []; 
    array.myMethod = function(arg1, arg2) { 
     // Use 'this' or 'array' to access the array. 
    }; 

    return array; 
}; 

Ora è possibile scrivere questo per creare un nuovo array estesa:

var arr = MyExtendedArray(); 
+0

Penso che il metodo factory sia esattamente ciò di cui ho bisogno per la mia specifica applicazione. È così ovvio ... non che lo vedo :-) Grazie! – Christophe

4

n. Array non può essere sottoclasse e si comporta ancora come una matrice. In particolare, la proprietà length non cambierà per riflettere gli elementi aggiunti o eliminati dall'array.

function MyArray() {} 
MyArray.prototype = []; 
MyArray.prototype.constructor = MyArray; 
var instance = new MyArray; 
instance[0] = 0; 
alert(instance.length); // alerts 0 

La ragione questo accade perché solo oggetti creati tramite new Array o zucchero sintattico come [] hanno la gestione speciale intorno alla lunghezza.

Il new MyArray sopra crea un oggetto regolare il cui prototipo è un Array, ma non c'è nulla che l'operatore new che controlla se il prototipo di un oggetto è un Array e imposta la gestione speciale length.

+0

+1 thx per le spiegazioni. – Christophe

+0

Stranamente, se si utilizza il metodo .push() per l'archiviazione dei dati nell'array, la lunghezza si aggiorna correttamente. –

+1

@ZlatinZlatev, i candidati recenti di EcmaScript hanno l'obiettivo di consentire la sottoclasse di elementi come Array, RegExp e Date in modo che questa risposta non sia corretta per molto più tempo. Forse stai vedendo un comportamento nei recenti motori JavaScript che stanno implementando un certo supporto per la sottoclasse degli array. –

4

Si può semplicemente aggiungere la funzione direttamente al vostro oggetto, piuttosto che al prototipo:

var myArray = new Array(); 
myArray.myFunc = function(){ /* do stuff! */ }; 
myArray.myFunc(); 
+0

+1 thx. Ho scelto la risposta di Elian che lo rende più generico. – Christophe

Problemi correlati