2012-03-31 16 views
29

Gli array hanno una proprietà "length" per impostazione predefinita.Aggiungi proprietà a javascript array

Posso aggiungere proprietà personalizzate?

Senza dover fare loro oggetti

+2

cosa intendete per * "aggiungere proprietà personalizzate senza doverle fare oggetti?" * Le matrici SONO oggetti. Quasi tutto in JS è un oggetto. E quali sono queste proprietà? Puoi spiegare ulteriormente? – Joseph

+0

Loro ** sono ** oggetti. Solo un tipo speciale di oggetti.Ad esempio funzioni simili, che sono anche un tipo speciale di oggetti. – ThiefMaster

+0

Vedere anche [questa domanda correlata] (http://stackoverflow.com/questions/24730145/what-are-the-drawback-of-setting-string-properties-on-arrays) per il motivo per cui non dovresti farlo. –

risposta

37

Sicuro.

var arr = [1,2,3,4,5]; 
arr.prop = 'value'; 

Array sono già oggetti in JavaScript - hanno solo alcune caratteristiche extra e una sintassi letterale speciale.

+0

la mia proprietà verrà iterata con il resto degli elementi? perché in console.log non lo vedo con testo opaco come "length" – ellabeauty

+5

Verranno iterati quando si usa 'for (var key in arr)'. Ma questo è qualcosa che non dovresti usare sugli array in ogni caso, quindi non dovrebbe essere un problema per te. A 'for (var i = 0; i ThiefMaster

+0

se si usa un ciclo 'for in', la proprietà sarà iterato. In un normale ciclo 'for', non lo sarà, dal momento che accederai a ciascun membro solo dal suo indice di array. Inoltre, non verrà iterato da metodi ES5 array nativi come 'forEach'. –

2

Sì. È possibile aggiungere l'oggetto semplicemente dichiarando e si può anche estendere l'Array utilizzando Array.prototype

var j = new Array(); 
j.yourprop = "foo"; 
+4

' var j = []; 'è più bello. – ThiefMaster

+3

Sì, sono d'accordo il mio modo di fare schifo –

+11

Preferisco 'var j = (function (array) {return new array();} (window.Array))' –

22

Come condizione altre risposte, è perfettamente possibile, perché gli array in JavaScript sono solo oggetti. Tuttavia, c'è ancora una domanda se sia una buona idea o no.

Questa è una domanda di "stile di codifica", quindi è difficile dirlo obiettivamente, ma Douglas Crockford non ha alcun problema con esso (almeno in alcuni casi). In JavaScript: The Good Parts, in realtà utilizza l'esempio di aggiunta di un metodo "totale" a un array.

Poiché un array è realmente un oggetto, possiamo aggiungere metodi direttamente all'array individuo:

// Give the data array a total function 

data.total = function() { 
    return this.reduce(add, 0); 
}; 

total = data.total(); // total is 108 

Poiché la stringa 'total' non è un intero, aggiunta di una proprietà total ad una matrice non cambia la sua lunghezza

(p62, "JavaScript le parti buone" di Crockford, che si trova sulla Google Books)

Tuttavia, vale la pena ricordare che queste proprietà extra non sono inclusi nella serializzazione JSON, e sarebbero stati gettati via se si fa qualcosa come arr = arr.slice(1);.

+0

Grazie per aver incluso i riferimenti. –

+0

Inoltre, se l'array passa attraverso i suoi metodi di prototipo (mappa, filtro, ecc.), La proprietà non verrà trasferita al nuovo array, poiché il metodo è stato inserito in un'istanza di 'Array'. Probabilmente previsto ma forse non desiderabile in questo caso? –

1

Se intendevi nasconderlo in una matrice ecc.? [almeno questo è quello che stavo cercando.]

Object.defineProperty(targ, "myVal", { enumerable: false, writable: true }); 

La matrice non aggiunge alla lunghezza in modo che sia un non proprietà un valore di I che si potrebbe dire.

Quindi se si desidera vedere le chiavi in ​​un oggetto, ad esempio, Object.keys non lo vedrà, ma Reflect.ownKeys lo farà.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect/ownKeys

La Riflettono versione di defineProperty tornerà successo o fallire, mentre i rendimenti di Object l'oggetto passato.

Ricorda preventEsensioni (come si dice) impediscono a te o ad altri di estenderle. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect/preventExtensions

Problemi correlati