2014-11-16 19 views
8

Wenn Sie ein normales JavaScript-Objekt mit say var obj = {}; erstellen, wird es den Objektprototyp haben. Gleiches gilt für Objekte, die mit var obj = new MyClass(); erstellt wurden. Bevor Object.create eingeführt wurde, gab es keinen Weg um diese. Heutzutage ist es jedoch möglich, ein Objekt ohne Prototyp (null als Prototyp) unter var obj = Object.create(null); zu erstellen.Anwendungsfälle von Object.create (null)?

Warum ist das wichtig? Welche Vorteile bringt es? Gibt es echte Anwendungsfälle?

+2

Gleiche wie in der Antwort erwähnt: http://www.devthought.com/2012/01/18/an-object-is-not-a-hash/ Für keine Auseinandersetzungen mit vererbten Eigenschaften sicherstellen . – Aravind

Antwort

9

Es ist ein vollständig leeres Objekt (nichts geerbt von .prototype einschließlich Object.prototype), so dass Sie garantiert werden können, dass jede Eigenschaftssuche nur erfolgreich ist, wenn die Eigenschaft explizit zum Objekt hinzugefügt wurde.

Wenn Sie beispielsweise einige Daten speichern möchten, bei denen Sie die Schlüssel nicht im Voraus kennen, besteht die Möglichkeit, dass ein angegebener Schlüssel denselben Namen wie ein Mitglied von Object.prototype hat und einen Fehler verursacht.

In diesen Fällen müssen Sie eine explizite .hasOwnProperty() Prüfung durchführen, um unerwartete vererbte Werte auszuschließen. Aber wenn nichts geerbt ist, kann Ihr Test vereinfacht werden zu einem if (key in my_object) { Test, oder vielleicht ein einfacher truthy Test wenn geeignet.

Ohne eine Prototyp-Kette würde ich mir auch vorstellen, dass Lookups von Eigenschaften, die nicht existieren, schneller wären, da nur das unmittelbare Objekt überprüft werden müsste. Ob dies in der Realität (aufgrund von Optimierungen) herauskommt oder nicht, würde mit Leistungstests festgestellt werden.

0

Der einzige Unterschied zwischen dem Erstellen eines Objekts mit {} und Object.create(null) besteht darin, dass der Objektprototyp nicht vererbt wird.

Das bedeutet, dass keine der Methoden, von denen wir normalerweise annehmen, dass wir ein beliebiges Objekt aufrufen können, existiert, z. B.,und valueOf. Eine Liste dieser finden sich hier: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/prototype

Aus Performance-Sicht ein Objekt einfach durch {} ist die Schaffung tatsächlich viel schneller, so dass, wenn Sie gerade nicht die Funktionen unter dem Objekt Prototyp haben, können Sie keine Objekte auf diese Weise schaffen sollten .

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

Verwandte Themen