Volver a JavaScript Básico

Clases y Prototipos

Las clases de JavaScript son azúcar sintáctica sobre la cadena de prototipos.

Definir una Clase

class Animal { // Campo privado (ES2022) #nombre; constructor(nombre, sonido) { this.#nombre = nombre; this.sonido = sonido; } hablar() { return `${this.#nombre} dice ${this.sonido}!`; } get nombre() { return this.#nombre; } static crear(nombre, sonido) { return new Animal(nombre, sonido); } } const perro = new Animal("Rex", "Guau"); console.log(perro.hablar()); // Rex dice Guau! const gato = Animal.crear("Bigotes", "Miau");

Herencia

class Perro extends Animal { #raza; constructor(nombre, raza) { super(nombre, "Guau"); // Llamar constructor padre this.#raza = raza; } buscar() { return `${this.nombre} trae la pelota!`; } // Sobreescribir hablar() { return `${super.hablar()} (${this.#raza})`; } } const rex = new Perro("Rex", "Labrador"); console.log(rex.hablar()); // Rex dice Guau! (Labrador) console.log(rex instanceof Perro); // true console.log(rex instanceof Animal); // true

Mixins (Composición)

// En lugar de herencia profunda, componer comportamientos const Serializable = (Base) => class extends Base { toJSON() { return JSON.stringify(this); } }; const ConFecha = (Base) => class extends Base { constructor(...args) { super(...args); this.creadoEn = new Date().toISOString(); } }; class Usuario extends ConFecha(Serializable(Animal)) {}

Cadena de Prototipos

// En lo que compilan las clases function Vehiculo(marca, modelo) { this.marca = marca; this.modelo = modelo; } Vehiculo.prototype.toString = function() { return `${this.marca} ${this.modelo}`; }; const auto = new Vehiculo("Toyota", "Corolla"); console.log(auto.toString()); // Toyota Corolla

Getters y Setters

class Temperatura { #celsius; constructor(celsius) { this.#celsius = celsius; } get fahrenheit() { return this.#celsius * 9/5 + 32; } set fahrenheit(f) { this.#celsius = (f - 32) * 5/9; } get celsius() { return this.#celsius; } set celsius(c) { if (c < -273.15) throw new RangeError("Por debajo del cero absoluto"); this.#celsius = c; } } const t = new Temperatura(100); console.log(t.fahrenheit); // 212 t.fahrenheit = 32; console.log(t.celsius); // 0

JS Moderno: Usa campos privados (#) para encapsular verdaderamente los internos de la clase. No son accesibles desde fuera, a diferencia de la convención _privado.