Tema 6 · Miembros Estáticos

Miembros Estáticos: static, Bloques de Inicialización y Métodos Utilitarios

Aprende a definir propiedades y métodos que pertenecen a la clase en sí y no a las instancias, ideales para utilidades, constantes y factorías con static.

¿Qué es un Miembro Estático?

Hasta ahora, todas las propiedades y métodos que hemos visto pertenecían a las instancias individuales creadas con new (cada usuario tenía su propio nombre y saldo).

Un miembro marcado con static pertenece a la Clase en sí misma. No requiere crear ningún objeto con new para ser utilizado:

class Calculadora {
    static sumar(a, b) {
        return a + b;
    }
}

// Invocación directa sin "new":
console.log(Calculadora.sumar(10, 5)); // 15

Ejemplos nativos que usas todos los días en JavaScript: Math.round(), Object.keys(), Array.isArray() o Date.now().

Casos de Uso Principales de `static`

Patrón de Uso Descripción Ejemplo de Llamada
Funciones Utilitarias Cálculos matemáticos, validadores de formato o conversiones que no dependen del estado de un objeto. Conversor.celsiusAFahrenheit(30);
Métodos Factoría Crear instancias especializadas con parámetros preconfigurados de forma más legible que el constructor. Usuario.crearAnonimo();
Contadores Globales Llevar la cuenta de cuántas instancias se han creado en total durante la ejecución. ConexionDB.totalConexiones;

¿A qué apunta `this` dentro de un método `static`?

¡Cuidado! Dentro de un método estático, this NO hace referencia a una instancia (porque no existe ninguna). En su lugar, this apunta a la propia clase constructora.

⚡ Clase Utilitaria y Factoría de Usuarios con Métodos Estáticos

Ejecuta el código en el Sandbox y observa cómo se invocan los métodos directamente desde la clase:

EstaticosDemo.js
Solo lectura
class Usuario {
    // 1. Propiedad Estática Compartida (Contador Global)
    static #totalUsuariosRegistrados = 0;
    static ROL_DEFAULT = "estudiante";

    constructor(nombre, email, rol = Usuario.ROL_DEFAULT) {
        this.nombre = nombre;
        this.email = email;
        this.rol = rol;

        // Cada vez que se crea un objeto, incrementamos el contador de la clase
        Usuario.#totalUsuariosRegistrados++;
    }

    // 2. Getter Estático para consultar el total
    static get totalRegistrados() {
        return Usuario.#totalUsuariosRegistrados;
    }

    // 3. Método Estático Factoría (Factory Method)
    static crearInvitado() {
        const idAleatorio = Math.floor(1000 + Math.random() * 9000);
        return new Usuario(`Invitado_${idAleatorio}`, "[email protected]", "invitado");
    }

    // 4. Método Estático Utilitario (Validador de email)
    static esEmailValido(email) {
        return typeof email === 'string' && email.includes('@') && email.includes('.');
    }

    obtenerPerfil() {
        return `[${this.rol.toUpperCase()}] ${this.nombre} (${this.email})`;
    }
}

// ==========================================
// PRUEBA EN EL SANDBOX (Sin instanciar primero)
// ==========================================
console.log("=== UTILIDADES ESTÁTICAS ===");
console.log("¿'[email protected]' es válido?:", Usuario.esEmailValido("[email protected]")); // true
console.log("¿'correo-falso' es válido?:", Usuario.esEmailValido("correo-falso")); // false
console.log("Rol por defecto de la plataforma:", Usuario.ROL_DEFAULT);

console.log("\n=== CREACIÓN DE INSTANCIAS ===");
const u1 = new Usuario("Carlos Mendoza", "[email protected]", "admin");
const u2 = new Usuario("Valeria Torres", "[email protected]");
const u3 = Usuario.crearInvitado(); // Usando el método factoría estático

console.log(u1.obtenerPerfil());
console.log(u2.obtenerPerfil());
console.log(u3.obtenerPerfil());

console.log("\n=== CONTADOR GLOBAL ESTÁTICO ===");
console.log(`Total de usuarios vivos en memoria: ${Usuario.totalRegistrados}`);
Pruébalo tú mismo » Se abre en una nueva pestaña con ejecución en vivo
🧠
Mini-Quiz de Retención
Comprueba tu comprensión antes de pasar a la siguiente lección
1 Pregunta
Pregunta 1
¿Cómo se debe invocar un método declarado con la palabra clave "static" dentro de una clase llamada Matematicas?
🦉
¿Tienes dudas con este tema?
Sócrates AI puede darte analogías y explicarte este código paso a paso.

🚀 ¿Quieres dominar Manual de Programación Orientada a Objetos en JavaScript (POO) y crear proyectos reales?

Aprende arquitectura limpia, desarrollo web moderno, buenas prácticas y despliegue en producción con nuestro Bootcamp Fullstack Developer con mentorías en vivo.

🏛️ Autoría y Propiedad Intelectual: Obra educativa original de David Amador para Kilopolis Academia (Solucionáticos), estructurada sobre las especificaciones y estándares abiertos del W3C, el estándar vivo de WHATWG y la documentación oficial de código abierto. © Todos los derechos reservados.