Heim  >  Artikel  >  Web-Frontend  >  Warum ist das Ändern des [[Prototyps]] eines Objekts ein Leistungskiller in JavaScript?

Warum ist das Ändern des [[Prototyps]] eines Objekts ein Leistungskiller in JavaScript?

Barbara Streisand
Barbara StreisandOriginal
2024-10-30 20:09:03528Durchsuche

Why is Modifying an Object's [[Prototype]] a Performance Killer in JavaScript?

Warum ist das Ändern des [[Prototyps]] des Objekts ein Leistungskiller?

Das Mozilla Developer Network (MDN) rät dringend davon ab, ein zu ändern Der [[Prototyp]] des Objekts, unabhängig von der verwendeten Methode. Diese Warnung ist auf die erheblichen Leistungseinbußen zurückzuführen, die bei modernen JavaScript-Implementierungen auftreten.

Während das Hinzufügen von Mitgliedsfunktionen zu JavaScript-Klassen über Function.prototype empfohlen wird, gelten die beiden folgenden Vorgänge:

foo.__proto__.bar = bar;
Foo.prototype.bar = bar;

sind funktional äquivalent und erstellen Sie eine „bar-Eigenschaft“ für das Object.getPrototypeOf(foo)“-Objekt.

Das Problem liegt nicht in der Erstellung der „bar“-Eigenschaft, sondern in der Zuweisung zur „__proto__“-Eigenschaft selbst:

fred.__proto__ = Object.prototype;

Dieser Vorgang unterbricht die JavaScript-Engine-Optimierungen für den Zugriff auf Eigenschaften. Indem Sie die Prototypenkette eines vorhandenen Objekts ändern, machen Sie alle vorherigen Optimierungsbemühungen effektiv zunichte.

Die V8-JavaScript-Engine verwendet beispielsweise versteckte Klassen, um die Suche nach Eigenschaften zu optimieren. Eine Änderung der Prototypenkette macht diese Optimierungen ungültig und zwingt die Engine, auf weniger effiziente Methoden zurückzugreifen.

Experten auf diesem Gebiet haben Bedenken hinsichtlich der Auswirkungen veränderlicher Prototypen auf die Leistung geäußert:

  • Brendan Eich: „Beschreibbares Proto ist ein riesiger Aufwand bei der Implementierung ... und es birgt alle möglichen Gefahren durch Typverwechslungen.“
  • Brian Hackett: „Das Zulassen von Skripten den Prototyp zu mutieren... macht es schwieriger, über das Verhalten eines Skripts nachzudenken und macht die VM-, JIT- und Analyseimplementierung komplexer und fehlerhafter.“
  • Jeff Walden: „Prototypmutation nach der Erstellung, mit ihren unregelmäßige Leistungsdestabilisierung und die Auswirkungen auf Proxys und [[SetInheritance]]“

Der Konsens ist klar: Das Mutieren des [[Prototyps]] eines Objekts beeinträchtigt die Leistungsoptimierung und sollte vermieden werden. Stattdessen ist die Erstellung neuer Objekte mit eindeutigen Prototypketten mithilfe von Object.create() der bevorzugte Ansatz.

Das obige ist der detaillierte Inhalt vonWarum ist das Ändern des [[Prototyps]] eines Objekts ein Leistungskiller in JavaScript?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn