Hintergrund
Die JavaScript-Sprache bietet zwei Methoden zur Manipulation die Prototypeigenschaft eines Objekts: die Standardfunktion setPrototypeOf und die nicht standardmäßige Eigenschaft __proto__. Es wird jedoch dringend davon abgeraten, den Prototyp eines Objekts mit einer dieser Methoden zu mutieren.
Auswirkungen auf die Leistung
Der MDN-Dokumentation zufolge verlangsamt sich die Mutation des Prototyps erheblich die nachfolgende Ausführung in modernen JavaScript-Implementierungen beeinträchtigen. Dies liegt daran, dass der Prozess eine Änderung des Objekttyps beinhaltet, wodurch zuvor optimierter Code ungültig wird und der Interpreter zur Deoptimierung gezwungen wird. Dieser Deoptimierungsprozess kann erhebliche Auswirkungen auf die Leistung haben.
Vergleich mutierender Methoden
Sowohl foo.__proto__.bar = bar als auch Foo.prototype.bar = bar create eine Bar-Eigenschaft für das Object.getPrototypeOf(foo)-Objekt. Das Festlegen der __proto__-Eigenschaft selbst, wie in fred.__proto__ = Object.prototype oder Object.setPrototypeOf(fred, Object.prototype), löst jedoch die Leistungsverschlechterung aus.
Zugrunde liegende Gründe
Das Ändern der Prototypenkette eines vorhandenen Objekts unterbricht die von JavaScript-Engines verwendeten internen Typoptimierungen. Die Engine muss zuvor kompilierten Code verwerfen und auf nicht optimierten Code zurückgreifen, was zu einer Leistungseinbuße führt.
Expertenmeinungen
Verschiedene Experten haben Bedenken hinsichtlich veränderlicher Prototypen geäußert :
Alternativen
Anstatt den Prototyp eines vorhandenen Objekts zu mutieren, Es wird empfohlen, mit Object.create() neue Objekte mit einer anderen Prototypenkette zu erstellen. Dieser Ansatz bewahrt Optimierungen und vermeidet die mit Prototypmutationen verbundenen Leistungseinbußen.
Das obige ist der detaillierte Inhalt vonWarum führen mutierende Objektprototypen zu Leistungseinbußen in JavaScript?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!