Herencia: extends y super
Una clase puede heredar de otra para reutilizar y especializar su
comportamiento, usando extends:
class Animal {
constructor(nombre) {
this.nombre = nombre;
}
describir() {
return `${this.nombre} hace un sonido`;
}
}
class Perro extends Animal {
describir() {
return `${this.nombre} ladra`;
}
}
Si la subclase tiene su propio constructor, debe llamar a super(...) para
inicializar la parte heredada:
class Gato extends Animal {
constructor(nombre, color) {
super(nombre); // ejecuta el constructor de Animal
this.color = color;
}
}
super.metodo() también permite llamar a un método de la clase padre.
Encapsulación: campos privados
Por defecto, todas las propiedades son accesibles desde fuera. Para datos que no
deben tocarse directamente, usa campos privados con #:
class CuentaBancaria {
#saldo = 0;
ingresar(cantidad) {
this.#saldo += cantidad;
}
get saldo() { // getter: se lee como una propiedad
return this.#saldo;
}
}
const c = new CuentaBancaria();
c.ingresar(100);
console.log(c.saldo); // 100 (c.#saldo daría error)
Getters y setters
Permiten ejecutar lógica al leer (get) o asignar (set) una
propiedad, manteniendo una sintaxis sencilla:
class Temperatura {
#celsius = 0;
get fahrenheit() {
return this.#celsius * 9 / 5 + 32;
}
set fahrenheit(f) {
this.#celsius = (f - 32) * 5 / 9;
}
}
Ejemplos
Herencia con super y un getter
class Vehiculo {
constructor(marca) {
this.marca = marca;
}
describir() {
return "Vehículo " + this.marca;
}
}
class Coche extends Vehiculo {
constructor(marca, puertas) {
super(marca);
this.puertas = puertas;
}
describir() {
return super.describir() + " con " + this.puertas + " puertas";
}
}
console.log(new Coche("Seat", 5).describir());