Command Palette

Search for a command to run...

Propiedades Estáticas: Datos Compartidos en Clases

Aprende a usar propiedades estáticas para compartir datos entre todas las instancias de una clase en JavaScript moderno.

Lectura: 18 min
Nivel: Intermedio

TL;DR - Resumen rápido

  • Las propiedades estáticas pertenecen a la clase, no a las instancias
  • Se acceden directamente en la clase sin crear instancias
  • Pueden ser públicas o privadas usando el prefijo #
  • Los bloques static {} permiten inicialización compleja
  • Se heredan en subclases y mantienen su referencia compartida
  • Son ideales para constantes, configuraciones y patrones Singleton

Introducción a Propiedades Estáticas

Las propiedades estáticas son propiedades que pertenecen a la clase en lugar de a las instancias. Se definen con la palabra clave static y se acceden directamente en la clase sin necesidad de crear una instancia.

Propiedades de clase vs propiedades de instancia

Las propiedades estáticas pertenecen a la clase y se acceden directamente en ella. Las propiedades de instancia pertenecen a los objetos creados con new.

Sintaxis de Propiedades Estáticas

Las propiedades estáticas se definen usando la palabra clave static antes del nombre de la propiedad. A diferencia de las propiedades de instancia que se crean en cada objeto, las propiedades estáticas existen una sola vez en la clase y son compartidas por todas las instancias.

sintaxis-propiedades-estaticas.js
Loading code...

En este ejemplo, VERSION y apiUrl son propiedades estáticas que se acceden directamente en la clase Aplicacion sin necesidad de crear una instancia. La propiedad usuario, por el contrario, es una propiedad de instancia que solo existe en los objetos creados con new.

Acceso sin instancias

Las propiedades estáticas se acceden con Clase.propiedad, mientras que las propiedades de instancia se acceden con instancia.propiedad. No necesitas crear un objeto para usar propiedades estáticas.

Propiedades Privadas Estáticas con #

Al igual que las propiedades de instancia, las propiedades estáticas pueden ser privadas usando el prefijo #. Esto crea propiedades que solo pueden ser accedidas desde dentro de la propia clase, proporcionando verdadera encapsulación a nivel de clase.

propiedades-privadas-estaticas.js
Loading code...

En este ejemplo, la clase BaseDatos usa propiedades estáticas privadas como #conexiones y #maxConexiones para mantener un estado compartido que no puede ser modificado desde fuera de la clase. Los métodos estáticos públicos proporcionan acceso controlado a estos datos internos.

Encapsulación a nivel de clase

Las propiedades estáticas privadas (#) son completamente inaccesibles desde fuera de la clase. Cualquier intento de acceder a BaseDatos.#conexiones generará un SyntaxError.

Bloques de Inicialización Estáticos

Los bloques de inicialización estáticos (static ) te permiten ejecutar código complejo durante la carga de la clase. Se ejecutan una sola vez cuando la clase se evalúa por primera vez, antes de que se cree cualquier instancia.

bloques-inicializacion-estaticos.js
Loading code...

Los bloques static son ideales para inicialización compleja que no puede hacerse con una simple asignación. En este ejemplo, la clase Config detecta el entorno de ejecución y configura propiedades estáticas basándose en condiciones complejas. Puedes tener múltiples bloques estáticos que se ejecutarán en orden.

Ejecución única al cargar la clase

Los bloques static se ejecutan exactamente una vez cuando JavaScript evalúa la definición de la clase, no cada vez que creas una instancia. Son perfectos para configuración inicial compleja.

Constantes vs Propiedades Mutables

Las propiedades estáticas pueden ser constantes (valores que no deberían cambiar) o mutables (datos que se modifican durante la ejecución). Por convención, las constantes se escriben en MAYÚSCULAS, aunque técnicamente pueden ser modificadas.

constantes-vs-mutables.js
Loading code...

En este ejemplo, la clase Servidor distingue claramente entre constantes (PUERTO_DEFECTO, TIMEOUT_DEFECTO) que no deberían cambiar, y propiedades mutables (servidoresActivos, requestsTotales) que se modifican durante la ejecución del programa. Las constantes proporcionan valores de configuración centralizados, mientras que las propiedades mutables mantienen estado compartido.

Convención de nombres

Usa MAYÚSCULAS para constantes estáticas (valores que no deberían cambiar) y camelCase para propiedades estáticas mutables (valores que cambiarán durante ejecución).

Herencia de Propiedades Estáticas

Las propiedades estáticas se heredan en las subclases, pero mantienen su referencia a la clase padre a menos que sean explícitamente sobrescritas. Esto permite que las subclases compartan propiedades estáticas del padre o definan las suyas propias.

herencia-propiedades-estaticas.js
Loading code...

En este ejemplo, las clases Mamifero y Ave heredan la propiedad reino de Animal, pero cada una define su propia propiedad clase y cantidadEspecies. Las propiedades heredadas apuntan al valor del padre hasta que se sobrescriben en la subclase. El uso de this.constructor permite acceder a propiedades estáticas desde métodos de instancia, obteniendo el valor específico de cada clase.

this.constructor para acceder desde instancias

Usa this.constructor.propiedad en métodos de instancia para acceder a propiedades estáticas de la clase correcta, incluso en jerarquías de herencia.

Patrón Singleton con Propiedades Estáticas

El patrón Singleton garantiza que una clase tenga solo una instancia y proporciona un punto de acceso global a ella. Las propiedades estáticas privadas son ideales para implementar este patrón en JavaScript.

singleton-pattern.js
Loading code...

En estos ejemplos, las clases BaseDatos y Logger implementan el patrón Singleton usando una propiedad estática privada #instancia. El método estático obtenerInstancia() verifica si existe una instancia y la crea si es necesario, garantizando que solo exista una instancia de la clase en toda la aplicación. Esto es útil para gestionar recursos compartidos como conexiones a bases de datos o sistemas de logging.

Cuándo usar Singleton

Usa el patrón Singleton para recursos que deben compartirse globalmente: conexiones a bases de datos, loggers, cachés, gestores de configuración o pools de conexiones.

Ejemplo Práctico: Sistema de Gestión de Tareas

Este ejemplo completo demuestra cómo usar propiedades estáticas (públicas y privadas), constantes, bloques de inicialización y métodos estáticos para crear un sistema de gestión de tareas con estadísticas en tiempo real.

ejemplo-practico.js
Loading code...

Este sistema de tareas combina múltiples conceptos: constantes estáticas para estados y prioridades, propiedades privadas estáticas para mantener el registro de todas las tareas, un bloque de inicialización estático para configurar el estado inicial, y métodos estáticos para consultas y estadísticas. Cada instancia se auto-registra en el constructor, y los cambios de estado actualizan automáticamente los contadores compartidos.

Patrón completo

Este ejemplo muestra cómo combinar propiedades estáticas públicas (constantes), privadas (estado compartido), bloques de inicialización y métodos estáticos para crear una API completa y encapsulada.

Resumen: Propiedades Estáticas

Conceptos principales:

  • Las propiedades estáticas pertenecen a la clase, no a las instancias
  • Se acceden directamente con Clase.propiedad sin crear objetos
  • Pueden ser públicas o privadas usando el prefijo #
  • Los bloques static {} permiten inicialización compleja al cargar la clase
  • Se heredan en subclases y pueden sobrescribirse
  • Son ideales para constantes, configuraciones y estado compartido

Mejores prácticas:

  • Usa MAYÚSCULAS para constantes y camelCase para mutables
  • Usa propiedades estáticas privadas (#) para encapsular estado compartido
  • Implementa el patrón Singleton con static #instancia
  • Usa bloques static {} para configuración inicial compleja
  • Accede a estáticas desde instancias con this.constructor.propiedad
  • Documenta claramente el propósito de cada propiedad estática