Статические блоки инициализации

Статические блоки инициализации — это совершенно новая функция JavaScript, стандартизированная в ECMAScript 2022 и поддерживаемая только в современных браузерах . Блоки статической инициализации позволяют динамически устанавливать значения статических полей, используя логику, охватывающую несколько операторов.

Чтобы создать статический блок инициализации, используйте ключевое слово static , за которым следует оператор блока в фигурных скобках ( {} ):

class MyClass {
  static {}
}

Этот шаблон позволяет инициализировать или изменять статические поля, объявленные в теле класса:

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

MyClass.secondProperty;
"Second property."

Эти операторы оцениваются во время первой инициализации класса, то есть когда движок JavaScript впервые оценивает его, а не при создании экземпляра класса, как в случае с constructor() :

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

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

Класс может содержать несколько статических блоков инициализации, и эти блоки оцениваются в том порядке, в котором они объявлены, наряду с любыми другими статическими полями и методами. Это означает, что в этом блоке доступны только поля, объявленные перед статическим блоком инициализации:

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

Проверьте свое понимание

Какие из следующих утверждений верны?

Статические блоки инициализации оцениваются при первой инициализации класса.
Поля, объявленные после блока статической инициализации, доступны внутри блока.
Класс может содержать только один статический блок инициализации.