[ Web Proxy ]
URL:
Viewing: https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Errors/Private_double_initialization [Back]  [Original]

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

Dieser Inhalt wurde automatisch aus dem Englischen bersetzt, und kann Fehler enthalten. Erfahre mehr ber dieses Experiment.

View in English Always switch to English

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 durchluft und die Klasse ein privates Element enthlt. Dies wird normalerweise durch den Trick zur Rckgabemodifikation verursacht.

In diesem Artikel

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

TypeError

Was ist schiefgelaufen?

Bei jedem Objekt wre es ein Fehler, ein privates Feld oder eine Methode zu installieren, wenn es diese bereits enthlt. Private Elemente werden auf den Wert von this installiert, wenn der Klassenkonstruktor aufgerufen wird. Dieser Fehler kann daher auftreten, wenn der this Wert bereits eine fertig konstruierte Instanz dieser Klasse ist.

Normalerweise ist this in einem Konstruktor ein neu erstelltes Objekt, das keine vorhandenen Eigenschaften hat. Es kann jedoch durch den Rckgabewert der Basisklasse berschrieben werden. Wenn die Basisklasse ein anderes Objekt zurckgibt, wrde dieses Objekt das aktuelle Objekt als den Wert von this 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 Sie new Derived(anyObject) aufrufen, wobei anyObject keine Instanz von Derived ist, wird der Derived-Konstruktor mit anyObject als this-Wert aufgerufen und das private Feld #x wird auf anyObject installiert. Dies ist der Trick der "Rckgabemodifikation", der es ermglicht, beliebige Informationen auf nicht verwandten Objekten zu definieren. Wird jedoch new Derived(new Derived()) oder erneut new Derived(anyObject) aufgerufen, versucht der Derived-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


Web Proxy Viewer  |  New URL  |  Original Page