Bloques de inicialización estáticos

Los bloques de inicialización estáticos son una función de JavaScript muy nueva, estandarizada en ECMAScript 2022 y solo son compatibles con los navegadores modernos. Los bloques de inicialización estáticos te permiten establecer el valor de los campos estáticos de forma dinámica, mediante una lógica que abarca varias declaraciones.

Para crear un bloque de inicialización estático, usa la palabra clave static seguida de una declaración de bloque entre llaves ({}):

class MyClass {
  static {}
}

Este patrón te permite inicializar o alterar los campos estáticos declarados en el cuerpo de la clase:

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

MyClass.secondProperty;
"Second property."

Estas declaraciones se evalúan en el momento en que se inicializa una clase por primera vez, es decir, cuando el motor de JavaScript la evalúa por primera vez, no cuando se crea una instancia de una clase, como en el caso de constructor():

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

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

Una clase puede contener varios bloques de inicialización estáticos, que se evalúan en el orden en que se declaran, junto con cualquier otro campo o método estático. Esto significa que solo los campos declarados antes de un bloque de inicialización estática están disponibles en ese bloque:

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

Verifica tus conocimientos

¿Cuáles de las siguientes afirmaciones son verdaderas?

Los bloques de inicialización estáticos se evalúan cuando se inicializa la clase por primera vez.
Una clase solo puede contener un bloque de inicialización estático.
Los campos declarados después de un bloque de inicialización estático están disponibles dentro del bloque.