Statische Initialisierungsblöcke

Statische Initialisierungsblöcke sind eine sehr neue JavaScript-Funktion, ECMAScript 2022 unterstützt. modernen Browsern. Mit statischen Initialisierungsblöcken können Sie den Wert statischer Felder dynamisch festlegen. mit einer Logik, die mehrere Anweisungen umfasst.

Um einen statischen Initialisierungsblock zu erstellen, verwenden Sie das Schlüsselwort static gefolgt von einem block-Anweisung in geschweifter Form Klammern ({}):

class MyClass {
  static {}
}

Mit diesem Muster können Sie statische Felder, die im Textkörper von deklariert sind, initialisieren oder ändern. der Klasse:

class MyClass {
  static firstProperty = 'First property.';
  static secondProperty;
  static {
    this.secondProperty = 'Second property.';
  }
}

MyClass.secondProperty;
"Second property."

Diese Anweisungen werden zum Zeitpunkt der Initialisierung einer Klasse ausgewertet, wenn die JavaScript-Engine ihn zum ersten Mal auswertet, und nicht, wenn eine Instanz eines -Klasse erstellt wird, wie bei constructor():

class MyClass {
    static {
        console.log( "Static initialization block." );
    }
    constructor() {
        console.log( "Constructor." );
    }
}
> "Static initialization block."

const myClassInstance = new MyClass();
> "Constructor."

Eine Klasse kann mehrere statische Initialisierungsblöcke enthalten. Diese Blöcke werden in der deklarierten Reihenfolge ausgewertet, zusammen mit allen anderen statischen Feldern . Das bedeutet, dass nur die Felder, die vor einer statischen Initialisierung deklariert wurden, Block sind in diesem Block verfügbar:

class MyClass {
  static myNewField;
  static {
    this.myNewField = this.myField;
  }
  static myField = "My value.";
};

MyClass.myNewField;
> undefined

class MyCorrectedClass {
  static myNewField;
  static myField = "My value.";
  static {
    this.myNewField = this.myField;
  }
};

MyCorrectedClass.myNewField;
> "My value."

Wissen testen

Welche der folgenden Aussagen sind wahr?

Statische Initialisierungsblöcke werden ausgewertet, wenn die Klasse zuerst initialisiert.
Felder, die nach einem statischen Initialisierungsblock deklariert wurden, sind verfügbar innerhalb des Blocks.
Eine Klasse kann nur einen statischen Initialisierungsblock enthalten.