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.