Herencia

<< Clases Operaciones con objetos >>

Una clase puede heredar de otra utilizando la palabra reservada extends. Heredará todas las propiedades y métodos de la clase padre. Por supuesto, podremos sobrescribirlos en la clase hija, pero seguimos pudiendo llamar a los métodos de la clase padre utilizando la palabra reservada super. De hecho, si creamos un constructor en la clase hija, debemos llamar al constructor padre utilizando super.

class User {
    constructor(name) {
        this.name = name;
    }

    sayHello() {
        console.log(`Hola, soy ${this.name}`);
    }
    
    sayType() {
        console.log("Soy un usuario");
    }
}

class Admin extends User {
    constructor(name) {
        super(name); // Llamamos al constructor de User
    }

    sayType() { // Método sobrescrito
        super.sayType(); // Llamamos a User.sayType (método del padre)
        console.log("Pero también un admin");
    }
}

let admin = new Admin("Anthony");
admin.sayHello(); // Imprime "Hola, soy Anthony"
admin.sayType(); // Imprime "Soy un usuario" y "Pero también un admin"

Valor primitivo y string

Cuando un objeto es convertido a string, el método toString (heredado de Object) es automáticamente llamado. Por defecto, imprimirá el texto "[object Object]", pero podemos sobreescribir este método.

class Persona {
    constructor(nombre, edad) {
        this.nombre = nombre;
        this.edad = edad;
    }

    toString() {
        return `${this.nombre} (${this.edad})`
    }
}

let p = new Persona("Ana", 34);
console.log("Persona: " + p); // # Persona: Ana (34)

Cuando comparamos objetos usando los operadores relacionales (>, <, >=, <=), obtenemos el el valor primitivo por defecto (por defecto toString()). Si sobrescribimos el método valueOf() (heredado de Object), devuelve otro valor primitivo, que será usado para este tipo de comparaciones.

class Persona {
    constructor(nombre, edad) {
        this.nombre = nombre;
        this.edad = edad;
    }

    // Otros métodos

    valueOf() {
        return this.edad; // Los objetos se compararán por edad
    }
}

let p = new Persona("Ana", 34);
let p2 = new Persona("Juan", 25);

console.log(p > p2); // true

<< Clases Operaciones con objetos >>