Auswirkungen der Änderung des [[Prototyps]] eines Objekts auf die Leistung
Die Mozilla-Dokumentation für die standardmäßige setPrototypeOf-Methode und die nicht standardmäßige __proto__ -Eigenschaft warnt davor, den [[Prototyp]] eines Objekts zu verändern, und betont dessen nachteilige Auswirkungen auf die Leistung in modernen JavaScript-Implementierungen.
Diese Warnung gilt jedoch nicht für das Hinzufügen von Mitgliedsfunktionen zu Klassen, die Function.prototype wie diesen verwenden :
function Foo(){} function bar(){} var foo = new Foo(); Foo.prototype.bar = bar; console.log(foo.__proto__.bar == bar); // true
In diesem Beispiel erzielen sowohl foo.__proto__.bar = bar als auch Foo.prototype.bar = bar das gleiche Ergebnis ohne Auswirkungen auf die Leistung.
Das Problem tritt auf, wenn eine Neuzuweisung erfolgt zur __proto__-Eigenschaft selbst:
function Employee() {} var fred = new Employee(); fred.__proto__ = Object.prototype; // Or equally: Object.setPrototypeOf(fred, Object.prototype);
Die Warnung in der Dokumentation besagt ausdrücklich, dass die Änderung der Prototypenkette eines vorhandenen Objekts die von modernen JavaScript-Engines durchgeführten Optimierungen stört. Es wird vorgeschlagen, mithilfe von Object.create() neue Objekte mit der gewünschten Prototypenkette zu erstellen.
Dieser Leistungsabfall ist auf die internen Implementierungsdetails versteckter Klassen in JavaScript-Engines wie V8 zurückzuführen. Wenn die Prototypkette eines Objekts geändert wird, ändert sich sein interner Typ, wodurch Optimierungen für die Eigenschaftssuche und kompilierter Code ungültig werden.
Experten in der JavaScript-Community haben die Komplexität und Fehlerrisiken hervorgehoben, die mit der Zulassung von Prototypmutationen nach der Erstellung verbunden sind Dies hat negative Auswirkungen auf Typinferenz, Proxys und Leistungsstabilität.
Daher stellt das Ändern von Mitgliedsfunktionen mithilfe von Function.prototype zwar keine Leistungsprobleme dar, eine Neuzuweisung der __proto__-Eigenschaft eines Objekts sollte jedoch vermieden werden, um Optimierungsnachteile zu vermeiden.
Das obige ist der detaillierte Inhalt vonWarum wirkt sich die Änderung des [[Prototyps]] eines Objekts auf die Leistung aus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!