Estendere oggetti di mappa
-
21-08-2019 - |
Domanda
Non so come estendere l'oggetto della mappa con prototipi e spero che tu possa aiutare. Ho qualcosa di simile:
var map = {'one':1, 'two':2};
e vorrei avere un metodo per verificare l'esistenza di una chiave:
if (map.containsKey('one')){...}
Come faccio a estendere l'oggetto mappa?
Soluzione
E 'pericoloso modificare Object.prototype , in quanto colpisce tutti gli oggetti e di solito rompere altre librerie che si sta utilizzando . In generale, se si desidera aggiungere metodi a un oggetto simile ai dizionari, è necessario creare un oggetto per le istanze di hash di ereditare da, come l'oggetto prototipo Hash .
Per questo caso specifico, si dovrebbe in realtà solo utilizzare if (key in map)
o if (map.hasOwnProperty(key))
.
Altri suggerimenti
C'è già un operatore per verificare l'esistenza di una chiave all'interno di un oggetto.
(in JavaScript, gli oggetti vengono implementati come mappe in modo in realtà non c'è una vera mappa.)
if( 'one' in map )
{
alert(map['one']);
}
Non si tratta di "mappe" sono oggetti. Sulla risposta di Maurice, se si vuole che questo si applica a tutti gli oggetti:
Object.prototype.containsKey = function(key) {
return this.hasOwnProperty(key);
};
Il modo più semplice per farlo è quello di aggiungere una funzione direttamente nell'oggetto:
map.containsKey = function(key) {
return this[key] ? true : false;
};
In Javascript, non avete bisogno di tale metodo davvero.
if ( map['one'] ) {
// do something
}
dovrebbe farlo
Come altri hanno detto, che si estende Object.prototype
potrebbe non essere una buona idea se il codice ha di bel gioco con il codice scritto da persone ignoranti di hasOwnProperty()
.
In ogni caso, ci sono tre modi 'corretta' che conosco per verificare se una proprietà è disponibile:
obj.hasOwnProperty(name)
controlla se una proprietà con data nome esiste nell'oggetto.
name in obj
include inoltre le proprietà ereditate tramite catena di prototipi di un oggetto.
typeof obj[name] !== 'undefined'
verrà inoltre valutata come false
se la proprietà è presente, ma è stato impostato su undefined
.
di (per esempio window.external
in IE) potrebbe non attuare <=>, Sufficiente JS non oggetto così uno degli altri controlli deve essere utilizzato.