Herança no JavaScript
Declaração extends
A palavra reservada extends
serve para indicar que uma classe herdará de outra.
Importante
Não é recomendável extender uma classe mais de 1 vez, pois isso torna a lógica do código muito complexa, dificultado a depuração e a manutenção. Como alternativa, você pode adotar a Composição de objetos com Mixins.
Sintaxe
class [nome da subclasse] extends [nome da superclasse] {
// ...
}
Exemplo
class DispositivoEletronico {
constructor(nome) {
this.nome = nome;
this.ligado = false;
}
ligar() {
if (this.ligado) {
console.log(this.nome + " já está ligado.");
return;
}
this.ligado = true;
}
desligar() {
if (!this.ligado) {
console.log(this.nome + " já está desligado.");
return;
}
this.ligado = false;
}
}
class Smartphone extends DispositivoEletronico {}
const smartphone = new Smartphone("Smartphone");
smartphone.ligar();
smartphone.ligar(); // Smartphone já está ligado.
smartphone.desligar();
smartphone.desligar(); // Smartphone já está desligado.
console.log(smartphone); // Smartphone { nome: 'Smartphone', ligado: false }
Declaração super
A palavra reservada super
é a representação da super classe em uma subclasse.
O método super()
é a representação do construtor da super classe em uma subclasse.
Exemplo
class DispositivoEletronico {
constructor(nome) {
this.nome = nome;
this.ligado = false;
}
ligar() {
if (this.ligado) {
console.log(this.nome + " já está ligado.");
return;
}
this.ligado = true;
}
desligar() {
if (!this.ligado) {
console.log(this.nome + " já está desligado.");
return;
}
this.ligado = false;
}
}
class Smartphone extends DispositivoEletronico {
constructor(nome, cor, modelo) {
super(nome);
this.cor = cor;
this.modelo = modelo;
}
}
const smartphone = new Smartphone("Smartphone", "preto", "Galaxy S10");
smartphone.ligar();
smartphone.ligar(); // Smartphone já está ligado.
smartphone.desligar();
smartphone.desligar(); // Smartphone já está desligado.
console.log(smartphone);
/*
Smartphone {
nome: 'Smartphone',
ligado: false,
cor: 'preto',
modelo: 'Galaxy S10'
}
*/