2014-11-16 14 views
8

Se si crea un oggetto javascript normale usando dire var obj = {}; avrà il prototipo dell'oggetto. Lo stesso vale per gli oggetti creati usando var obj = new MyClass(); Prima che fosse introdotto Object.create non c'era modo di aggirare questo. Tuttavia oggigiorno è possibile creare un oggetto senza prototipo (rispettivamente null come prototipo) usando var obj = Object.create(null);.Casi di utilizzo di Object.create (null)?

Perché è importante? Quali vantaggi porta? Ci sono casi d'uso nel mondo reale?

+2

Idem come indicato nella risposta: http://www.devthought.com/2012/01/18/an-object-is-not-a-hash/ Per fare in modo scontri con le proprietà ereditate . – Aravind

risposta

9

È un oggetto completamente vuoto (nulla ereditato da qualsiasi .prototype inclusivo di Object.prototype), quindi è possibile garantire che qualsiasi ricerca di proprietà avrà esito positivo solo se la proprietà è stata esplicitamente aggiunta all'oggetto.

Ad esempio, se si desidera memorizzare alcuni dati in cui non si conosceranno i tasti in anticipo, è possibile che una chiave fornita abbia lo stesso nome di un membro di Object.prototype e causi un bug.

In questi casi, è necessario eseguire un controllo esplicito .hasOwnProperty() per escludere valori ereditati imprevisti. Ma se non c'è nulla di ereditato, il test può essere semplificato in un test if (key in my_object) { o, in alternativa, un semplice test di verità if (my_object[key]) {, se appropriato.

Inoltre, senza una catena di prototipi, immagino che le ricerche di proprietà che risultano non esistere sarebbero più veloci, dal momento che solo l'oggetto immediato dovrebbe essere controllato. Indipendentemente dal fatto che questo si estenda in realtà (a causa di ottimizzazioni), verrà determinato con test delle prestazioni.

0

L'unica differenza tra la creazione di un oggetto con {} e Object.create(null) è che il prototipo dell'oggetto non verrà ereditato da.

Ciò significa che nessuno dei metodi che assumiamo in genere che possiamo chiamare su qualsiasi oggetto non esiste, come ad esempio toString e valueOf. Un elenco di questi può essere trovato qui: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/prototype

Dal punto di vista delle prestazioni, la creazione di un oggetto semplicemente {} è in realtà molto più veloce, quindi a meno che in particolare non può avere le funzioni sotto il prototipo di un oggetto non si dovrebbe creare oggetti in quel modo .

http://jsperf.com/null-vs-empty-object-performance

Problemi correlati