Anwendungsfälle von Object.create (null)?

8

Wenn Sie ein reguläres JavaScript-Objekt mit say var obj = {}; erstellen, wird es den Objektprototyp haben. Dasselbe gilt für Objekte, die mit var obj = new MyClass(); erstellt wurden. Bevor Object.create eingeführt wurde, gab es keine Möglichkeit, dies zu tun. Heutzutage ist es jedoch möglich, ein Objekt ohne Prototyp ( null als Prototyp) mit var obj = Object.create(null); zu erstellen.

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

    
Wingblade 16.11.2014, 20:13
quelle

2 Antworten

9

Es ist ein vollständig leeres Objekt (nichts geerbt von .prototype inkl. Object.prototype ), so dass sichergestellt werden kann, dass jede Eigenschaftssuche nur erfolgreich ist, wenn die Eigenschaft explizit zum Objekt hinzugefügt wurde.

Wenn Sie beispielsweise 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 auf einen if (key in my_object) { test oder vielleicht einen einfachen truthy test if (my_object[key]) { vereinfacht werden.

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.

    
six fingered man 16.11.2014, 20:22
quelle
0

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

Dies bedeutet, dass keine der Methoden, von denen wir normalerweise annehmen, dass wir irgendein Objekt aufrufen können, nicht existiert, wie zum Beispiel toString und valueOf . Eine Liste dieser finden Sie hier: Ссылка

Aus Performanceperspektive ist das Erstellen eines Objekts einfach durch {} tatsächlich viel schneller. Wenn Sie also nicht speziell die Funktionen unter dem Objektprototyp verwenden können, sollten Sie keine Objekte auf diese Weise erstellen.

Ссылка

    
David Li 11.10.2015 02:18
quelle

Tags und Links