Statyczne bloki inicjowania

Statyczne bloki inicjowania to nowa funkcja JavaScript ustandaryzowana ECMAScript 2022 i obsługiwane tylko w nowoczesnych przeglądarek. Statyczne bloki inicjowania umożliwiają dynamiczne ustawianie wartości pól statycznych, za pomocą logiki obejmującej wiele instrukcji.

Aby utworzyć statyczny blok inicjowania, użyj słowa kluczowego static, a następnie instrukcja blokowa w ciągu znaków curly nawiasy ({}):

class MyClass {
  static {}
}

Ten wzorzec umożliwia inicjowanie lub zmianę pól statycznych zadeklarowanych w treści zajęcia:

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

MyClass.secondProperty;
"Second property."

Te instrukcje są oceniane w momencie pierwszego zainicjowania klasy, która gdy mechanizm JavaScript najpierw go oceni, a nie wystąpienie zostało utworzone zajęcia, podobnie jak w przypadku klasy constructor():

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

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

Klasa może zawierać wiele statycznych bloków inicjowania, które są: są oceniane w kolejności, w jakiej są zadeklarowane, razem z pozostałymi polami statycznymi i . Oznacza to, że tylko pola zadeklarowane przed zainicjowaniem statycznym bloki:

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."

Sprawdź swoją wiedzę

Które z poniższych stwierdzeń jest prawdziwe?

Statyczne bloki inicjowania są oceniane, gdy klasa to .
Klasa może zawierać tylko jeden statyczny blok inicjowania.
Pola zadeklarowane po bloku statycznego inicjowania są dostępne wewnątrz bloku.