Blocs d'initialisation statiques

Les blocs d'initialisation statiques sont une toute nouvelle fonctionnalité JavaScript, standardisée dans ECMAScript 2022 et uniquement compatible avec les navigateurs modernes. Les blocs d'initialisation statique vous permettent de définir la valeur des champs statiques de manière dynamique, à l'aide d'une logique qui englobe plusieurs instructions.

Pour créer un bloc d'initialisation statique, utilisez le mot clé static suivi d'une instruction de bloc entre accolades ({}):

class MyClass {
  static {}
}

Ce modèle vous permet d'initialiser ou de modifier des 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 la première initialisation d'une classe, c'est-à-dire lorsque le moteur JavaScript l'évalue pour la première fois, et non lors de la création d'une instance d'une classe, comme avec 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 et méthodes statiques. Cela signifie que seuls les champs déclarés avant un bloc d'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 ?

Les blocs d'initialisation statiques sont évalués lors de la première initialisation de la classe.
Une classe ne peut contenir qu'un seul bloc d'initialisation statique.
Les champs déclarés après un bloc d'initialisation statique sont disponibles dans le bloc.