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?
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.
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.
Tags und Links javascript null prototype