2014-11-16 16 views
8

Jeśli utworzysz zwykły obiekt javascript, używając var obj = {};, będzie on miał prototyp obiektu. To samo dotyczy obiektów utworzonych przy użyciu metody var obj = new MyClass(); Przed wprowadzeniem, nie było możliwości obejścia tego. Jednak obecnie możliwe jest utworzenie obiektu bez prototypu (odpowiednio prototypem: null) przy użyciu var obj = Object.create(null);.Użyj przypadków Object.create (null)?

Dlaczego jest to ważne? Jakie ma to zalety? Czy są jakieś przypadki użycia rzeczywistego świata?

+2

samo jak wspomniano w odpowiedzi: http://www.devthought.com/2012/01/18/an-object-is-not-a-hash/ Dla upewniając żadnych starć z odziedziczonych nieruchomości . – Aravind

Odpowiedz

9

Jest to obiekt całkowicie pusty (nic odziedziczonego po .prototype inclusing Object.prototype), więc można zagwarantować, że wyszukiwanie właściwości zakończy się pomyślnie, tylko jeśli właściwość została jawnie dodana do obiektu.

Na przykład, jeśli chcesz przechowywać pewne dane, w których wcześniej nie znasz kluczy, istnieje możliwość, że dostarczony klucz będzie miał taką samą nazwę jak członek Object.prototype i spowoduje błąd.

W takich przypadkach należy wykonać wyraźną kontrolę, aby wykluczyć nieoczekiwane odziedziczone wartości. Ale jeśli nie ma nic odziedziczonego, twoje testy można uprościć do testu if (key in my_object) { lub, jeśli to konieczne, prostego testu na prawdę if (my_object[key]) {.

Ponadto, bez łańcucha prototypów, wyobrażam sobie, że wyszukiwanie właściwości, które okazały się nieistotne, byłoby szybsze, ponieważ tylko bezpośredni obiekt musiałby zostać sprawdzony. Niezależnie od tego, czy w rzeczywistości (dzięki optymalizacjom), czy nie, zostanie to określone przy testowaniu wydajności.

0

Jedyna różnica między tworzeniem obiektu z {} i Object.create(null) polega na tym, że prototyp obiektu nie zostanie odziedziczony.

Oznacza to, że żadna z metod, które zwykle zakładamy, że możemy wywołać dowolny obiekt, nie istnieje, na przykład toString i valueOf. Ich listę można znaleźć tutaj: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/prototype

Z perspektywy wydajności tworzenie obiektu po prostu przez {} jest w rzeczywistości znacznie szybsze, więc jeśli nie możesz konkretnie wykonywać funkcji w ramach prototypu obiektu, nie powinieneś tworzyć obiektów w ten sposób .

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

Powiązane problemy