Movatterモバイル変換


[0]ホーム

URL:


MDN Web Docs

Experiment: Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten.

TypeError: Es ist ein Fehler, ein Objekt mit privaten Feldern/Methoden zweimal zu initialisieren

Der JavaScript-Fehler "Initializing an object twice is an error with private fields/methods" tritt auf, wenn ein Objekt, das über einen Klassenkonstruktor erstellt wurde, erneut den Klassenkonstruktionsprozess durchläuft und die Klasse einprivates Element enthält. Dies wird normalerweise durch den Trick zurRückgabemodifikation verursacht.

Meldung

TypeError: Cannot initialize #x twice on the same object (V8-based)TypeError: Initializing an object twice is an error with private fields (Firefox)TypeError: Cannot redefine existing private field (evaluating 'super(o)') (Safari)TypeError: Cannot initialize private methods of class X twice on the same object (V8-based)TypeError: Initializing an object twice is an error with private methods (Firefox)TypeError: Cannot install same private methods on object more than once (evaluating 'super(o)') (Safari)

Fehlertyp

Was ist schiefgelaufen?

Bei jedem Objekt wäre es ein Fehler, ein privates Feld oder eine Methode zu installieren, wenn es diese bereits enthält. Private Elemente werden auf den Wert vonthis installiert, wenn der Klassenkonstruktor aufgerufen wird. Dieser Fehler kann daher auftreten, wenn derthis Wert bereits eine fertig konstruierte Instanz dieser Klasse ist.

Normalerweise istthis in einem Konstruktor ein neu erstelltes Objekt, das keine vorhandenen Eigenschaften hat. Es kann jedoch durch den Rückgabewert der Basisklasse überschrieben werden. Wenn die Basisklasse ein anderes Objekt zurückgibt, würde dieses Objekt das aktuelle Objekt als den Wert vonthis ersetzen:

js
class Base {  constructor(o) {    // This object will become the this value of any subclass    return o;  }}class Derived extends Base {  #x = 0;}

Wenn Sienew Derived(anyObject) aufrufen, wobeianyObject keine Instanz vonDerived ist, wird derDerived-Konstruktor mitanyObject alsthis-Wert aufgerufen und das private Feld#x wird aufanyObject installiert. Dies ist der Trick der "Rückgabemodifikation", der es ermöglicht, beliebige Informationen auf nicht verwandten Objekten zu definieren. Wird jedochnew Derived(new Derived()) oder erneutnew Derived(anyObject) aufgerufen, versucht derDerived-Konstruktor, das private Feld#x erneut zu installieren, diesmal auf einem Objekt, das das private Feld#x bereits besitzt, wodurch dieser Fehler verursacht wird.

Siehe auch

MDN-Feedback-Box

Diese Seite wurde automatisch aus dem Englischen übersetzt.


[8]ページ先頭

©2009-2025 Movatter.jp