Miembros estáticos de clases en JavaScript
Aprende propiedades y métodos estáticos en JavaScript: cómo definirlos con la palabra clave static, heredarlos en subclases, crear métodos de fábrica, usar bloques de inicialización estática y cómo se comporta this dentro de un método estático.
Las propiedades y métodos estáticos pertenecen a la clase en sí misma, no a las instancias creadas a partir de ella. Esto significa que se llaman directamente sobre el nombre de la clase — sin necesidad de escribir new. Son la herramienta adecuada para funciones de utilidad y constantes compartidas que conciernen a la clase en su conjunto, más que a cualquier objeto individual.
Si ya has usado los objetos integrados de JavaScript, habrás utilizado miembros estáticos sin nombrarlos como tales:
Date.now()devuelve la marca de tiempo actual — se llama sobreDate, no sobre una instancia de fecha.Array.from(iterable)construye un array — se llama sobre la claseArray, no sobre un array existente.Object.keys(obj)lista las claves propias de un object — se llama sobreObject.Math.max(...)yNumber.isInteger(...)también son estáticos.
Este capítulo explica cómo definir tus propias propiedades y métodos estáticos, cómo son heredados por las subclases, cómo se comporta this dentro de ellos, y los patrones comunes (métodos de fábrica y bloques de inicialización estática) que usarás en código real. Si las clases son nuevas para ti, comienza primero con sintaxis básica de clases.
Definir propiedades y métodos estáticos
Las propiedades y métodos estáticos se definen usando la palabra clave static dentro del cuerpo de una clase. Así es como se definen y utilizan:
En este ejemplo, pi es una propiedad estática y sum es un método estático de la clase Calculator. Se puede acceder a ellos directamente a través del nombre de la clase sin instanciarla.
Nota: La sintaxis de campo de clase estático (static pi = ...) requiere ES2022+ o un transpilador como Babel. Además, un método estático no puede acceder a las propiedades de una instancia a través de this, porque pertenece a la clase en sí misma y no a ninguna instancia específica.
this dentro de un método estático
Dentro de un método estático, this hace referencia a la clase, no a una instancia. Esto permite que un método estático llame a otro método estático o lea una propiedad estática de la misma clase:
Debido a que this se resuelve como la clase, el mismo método estático se comporta de forma diferente dependiendo de qué clase se use para llamarlo — un detalle clave una vez que la herencia entra en juego (ver la sección siguiente).
Heredar miembros estáticos en subclases
Las propiedades y métodos estáticos se heredan. Cuando una subclase extiende (extends) una clase padre, obtiene acceso a los miembros estáticos del padre y puede llamarlos a través de su propio nombre:
Aquí Advanced.sum se hereda de Calculator. Dentro de Advanced.double, this es Advanced, por lo que this.sum(...) encuentra sum en la cadena de prototipos.
Dado que this apunta a la clase sobre la que se llamó el método, una subclase puede sobrescribir un miembro estático y los otros métodos estáticos del padre usarán la versión sobrescrita cuando se llamen a través de la subclase:
Para más información sobre cómo extender clases, consulta herencia de clases.
Métodos de fábrica estáticos
Un patrón común es un método de fábrica: un método estático que construye y devuelve una instancia de la clase, frecuentemente a partir de datos en un formato diferente. Esto mantiene la lógica de construcción en un único lugar con nombre y hace que el código que lo llama sea claro y legible.
Un ejemplo típico es crear un object a partir de un string JSON o un object plano recibido desde una API:
Usar new this(...) en lugar de new User(...) significa que una subclase que llame a fromJSON obtendrá automáticamente una instancia de la subclase.
Cuándo usar propiedades estáticas
Las propiedades estáticas son ideales para constantes relacionadas con una clase que no cambian, independientemente de la instancia. Proporcionan una forma de acceder a datos compartidos desde cualquier parte del código. Por ejemplo, si tienes una clase que gestiona interacciones de usuarios, podrías tener una propiedad estática que defina configuraciones o límites predeterminados:
Para constantes que nunca deben reasignarse desde fuera de la clase, considera combinar campos estáticos con miembros privados (static #secret = ...).
Bloques de inicialización estática
A veces una propiedad estática necesita más que una sola expresión para configurarse — por ejemplo, depende de varios otros miembros estáticos, requiere un bucle o necesita un bloque try/catch. ES2022 añadió los bloques de inicialización estática (static { ... }) exactamente para esto. El bloque se ejecuta una vez, cuando se define la clase, con this vinculado a la clase:
Puedes tener más de un bloque estático, y se ejecutan en orden de aparición junto con los inicializadores de campos estáticos. Son ideales para una configuración calculada que sería difícil de expresar como una única asignación de campo.
Ventajas de usar propiedades y métodos estáticos
- Eficiencia de memoria: Dado que las propiedades y métodos estáticos están vinculados a la clase en sí misma y no a las instancias, evitan duplicar datos o funciones para cada object, lo que puede reducir la sobrecarga de memoria cuando se crean muchas instancias.
- Conveniencia: Los métodos estáticos pueden llamarse sin instanciar la clase, lo que los hace convenientes para funciones de utilidad.
- Código organizado: Al agrupar la funcionalidad relacionada directamente dentro de las clases como miembros estáticos, el código se mantiene organizado y las áreas funcionales quedan claramente definidas.
Resumen
- Los miembros estáticos se declaran con la palabra clave
staticy viven en la clase, no en las instancias — se llaman comoClassName.member. - Los integrados conocidos como
Date.now(),Array.from()yObject.keys()son métodos estáticos. - Dentro de un método estático,
thises la clase sobre la que fue llamado. Las subclases heredan los miembros estáticos y pueden sobrescribirlos, ythisse resuelve en consecuencia. - Usa métodos de fábrica (
static fromJSON(...)que devuelvenew this(...)) para centralizar la construcción de objetos, y bloques de inicialización estática (static { ... }, ES2022) para la configuración que necesita más que una sola expresión. - Recurre a los miembros estáticos para utilidades y constantes compartidas; usa métodos regulares (de instancia) para comportamientos que dependen de los datos de un objeto específico.
Próximos pasos
- Sintaxis básica de clases — los fundamentos de
class, constructores y métodos de instancia. - Herencia de clases — cómo funcionan
extendsysuper, incluyendo con miembros estáticos. - Propiedades y métodos privados y protegidos — combina
#privateconstaticpara proteger datos a nivel de clase.