Herança: extends e super
Uma classe pode herdar de outra para reutilizar e especializar seu
comportamento, usando extends:
class Animal {
constructor(nome) {
this.nome = nome;
}
descrever() {
return `${this.nome} faz um som`;
}
}
class Cachorro extends Animal {
descrever() {
return `${this.nome} late`;
}
}
Se a subclasse tem seu próprio constructor, ela deve chamar super(...) para
inicializar a parte herdada:
class Gato extends Animal {
constructor(nome, cor) {
super(nome); // executa o constructor de Animal
this.cor = cor;
}
}
super.metodo() também permite chamar um método da classe pai.
Encapsulamento: campos privados
Por padrão, todas as propriedades são acessíveis de fora. Para dados que não
devem ser tocados diretamente, use campos privados com #:
class ContaBancaria {
#saldo = 0;
depositar(quantia) {
this.#saldo += quantia;
}
get saldo() { // getter: lê-se como uma propriedade
return this.#saldo;
}
}
const c = new ContaBancaria();
c.depositar(100);
console.log(c.saldo); // 100 (c.#saldo daria um erro)
Getters e setters
Permitem executar lógica ao ler (get) ou atribuir (set) uma
propriedade, mantendo uma sintaxe simples:
class Temperatura {
#celsius = 0;
get fahrenheit() {
return this.#celsius * 9 / 5 + 32;
}
set fahrenheit(f) {
this.#celsius = (f - 32) * 5 / 9;
}
}
Exemplos
Herança com super e um getter
class Veiculo {
constructor(marca) {
this.marca = marca;
}
descrever() {
return "Veículo " + this.marca;
}
}
class Carro extends Veiculo {
constructor(marca, portas) {
super(marca);
this.portas = portas;
}
descrever() {
return super.descrever() + " com " + this.portas + " portas";
}
}
console.log(new Carro("Seat", 5).descrever());