Blocs d'initialisation statiques

Les blocs d'initialisation statiques sont une toute nouvelle fonctionnalité JavaScript, standardisée ECMAScript 2022 et uniquement disponible dans navigateurs les plus récents. Les blocs d'initialisation statiques vous permettent de définir la valeur des champs statiques de manière dynamique, en utilisant une logique qui englobe plusieurs instructions.

Pour créer un bloc d'initialisation statique, utilisez le mot clé static suivi d'un instruction de bloc dans une ligne bouclée crochets ({}):

class MyClass {
  static {}
}

Ce modèle vous permet d'initialiser ou de modifier les champs statiques déclarés dans le corps de la classe:

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

MyClass.secondProperty;
"Second property."

Ces instructions sont évaluées lors de l'initialisation d'une classe, c'est-à-dire lorsque le moteur JavaScript l'évalue pour la première fois, et non lorsqu'une instance est créée, comme pour constructor():

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

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

Une classe peut contenir plusieurs blocs d'initialisation statiques. Ces blocs sont évalués dans l'ordre dans lequel ils sont déclarés, avec tous les autres champs statiques et méthodes. Cela signifie que seuls les champs déclarés avant une initialisation statique sont disponibles dans ce bloc:

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

Testez vos connaissances

Parmi les affirmations suivantes, lesquelles sont vraies ?

Une classe ne peut contenir qu'un seul bloc d'initialisation statique.
Les blocs d'initialisation statiques sont évalués lorsque la classe est est d'abord initialisé.
Les champs déclarés après un bloc d'initialisation statique sont disponibles à l'intérieur du bloc.