Credo che il vantaggio principale è quello di essere in grado per controllare cosa viene visualizzato quando si enumerano le proprietà di un oggetto, ad esempio for in
o Object.keys()
.
MDN spiega bene con Object.defineProperty
: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/defineProperty
così normalmente, quando la gente vuole aggiungere un metodo per Object
, come ad esempio un polyfill per qualche metodo non supportato in vecchi browser, essi modificano il .prototype
. Ma questo rende la proprietà enumerabile e incasella ciò che viene restituito nella raccolta loop/chiavi (senza usare .hasOwnProperty
... che non tutti usano).
Così, invece di qualcosa come:
Object.prototype.myMethod = function() {
alert("Ahh");
};
si potrebbe usare Object.defineProperty
dire in modo esplicito per averlo non essere enumerabile:
Object.defineProperty(Object.prototype, 'myMethod', {
value: function() {
alert("Ahh");
},
enumerable: false
});
In questo modo, per esempio quando si utilizza for (var key in obj)
, "myMethod "non sarà un elemento elencato e non dovrai preoccuparti di utilizzare .hasOwnProperty
. Il problema principale con questo è che alcuni browser non lo supportano ovviamente: http://kangax.github.com/es5-compat-table/ e che non tutte le librerie/il codice lo usano, quindi non si può sempre fare affidamento su librerie esterne/codice per fare un uso corretto e sempre.
È possibile accedere a una proprietà non enumerabile in qualsiasi momento, ma non verrà visualizzato quando si enumerano le proprietà dell'oggetto: questo è il punto principale.
E credo che tutte le proprietà "predefinite" degli oggetti non siano enumerabili. Con ciò intendo solo proprietà native, non necessariamente ereditate o create. Quindi con il tuo esempio, pop
e push
sarà non essere enumerato, ma Array.prototype.indexOf
sarà se è stato creato come un polyfill su un vecchio browser che non supporta tale metodo ...che, naturalmente, può essere evitato usando Object.defineProperty
come il mio esempio sopra. Un altro esempio è la proprietà length
, che non viene enumerata.
Ecco un esempio in generale: http://jsfiddle.net/aHJ3g/
L'uso e la definizione di Object.keys
è importante: "restituisce un array di proprie proprietà enumerabili di un determinato oggetto, nello stesso ordine di quella fornita da un anello for-in
(la differenza dal momento che un ciclo for-in
enumera anche le proprietà nella catena del prototipo. " - da MDN - https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/keys
Credo che il vantaggio principale è quello di rendere 'per tale dicitura loop di sicurezza - la proprietà non verrà mostrata quando l'iterazione sopra l'oggetto. Forse sto dimenticando cosa fa l'enumerabilità ... – Ian
Correlati: [Quali sono i vantaggi e i pericoli dell'aggiunta di metodi a Object.prototype in Javascript?] (Http://stackoverflow.com/questions/3832617/what-are-the -benefici-e-pericoli-di-aggiunta-metodi-to-oggetto-prototipo-in-Javas? RQ = 1). –