Статические блоки инициализации — это совершенно новая функция 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."
Проверьте свое понимание
Какие из следующих утверждений верны?