7.1 Fundamentos da Herança
A herança de classes em JavaScript permite criar novas classes baseadas em classes já existentes, reutilizando e expandindo sua funcionalidade. Isso é um aspecto chave da programação orientada a objetos (OO), que permite criar hierarquias de classes e gerenciar o comportamento dos objetos.
Para herança de classes, é utilizada a palavra-chave extends. A classe que herda de outra é chamada de classe derivada (subclass), e a classe da qual a herança é feita é chamada de classe base (superclass).
Exemplo:
class Animal {
constructor(name) {
this.name = name;
}
speak() {
console.log(`${this.name} makes a noise.`);
}
}
class Dog extends Animal {
speak() {
console.log(`${this.name} barks.`);
}
}
const dog = new Dog('Rex');
dog.speak(); // "Rex barks."
Explicação:
- A classe
Animalé a classe base com um construtor e um métodospeak() - A classe
Dogherda deAnimale reescreve o métodospeak() - A instância
dogda classeDogusa o método reescritospeak()
7.2 Palavra-chave super
A palavra-chave super é usada para chamar o construtor ou métodos da classe base a partir da classe derivada.
1. Chamada do construtor da classe base
A classe derivada deve chamar o construtor da classe base usando super() antes de utilizar this.
Exemplo:
O construtor Dog chama super(name) para inicializar a propriedade name da classe base Animal.
class Animal {
constructor(name) {
this.name = name;
}
speak() {
console.log(`${this.name} makes a noise.`);
}
}
class Dog extends Animal {
constructor(name, breed) {
super(name);
this.breed = breed;
}
speak() {
console.log(`${this.name} barks.`);
}
}
const dog = new Dog('Rex', 'Labrador');
console.log(dog.name); // "Rex"
console.log(dog.breed); // "Labrador"
dog.speak(); // "Rex barks."
2. Chamada dos métodos da classe base
Os métodos da classe base podem ser chamados a partir da classe derivada usando super.
Exemplo:
O método speak() da classe Dog chama o método speak() da classe base Animal usando super.speak(), e então executa sua própria lógica.
class Animal {
constructor(name) {
this.name = name;
}
speak() {
console.log(`${this.name} makes a noise.`);
}
}
class Dog extends Animal {
speak() {
super.speak(); // Chamada do método da classe base
console.log(`${this.name} barks.`);
}
}
const dog = new Dog('Rex');
dog.speak();
// "Rex makes a noise."
// "Rex barks."
7.3 Herança e reescrita de métodos
A herança permite que as classes derivadas reescrevam métodos da classe base. Isso possibilita alterar ou expandir a funcionalidade dos métodos.
Exemplo:
O método speak() da classe Dog reescreve o método speak() da classe base Animal, fornecendo sua própria implementação.
class Animal {
constructor(name) {
this.name = name;
}
speak() {
console.log(`${this.name} makes a noise.`);
}
}
class Dog extends Animal {
speak() {
console.log(`${this.name} barks.`);
}
}
const animal = new Animal('Generic Animal');
animal.speak(); // "Generic Animal makes a noise."
const dog = new Dog('Rex');
dog.speak(); // "Rex barks."
7.4 Herança e métodos adicionais
A classe derivada pode adicionar novos métodos que não existem na classe base.
Exemplo:
A classe Dog adiciona um novo método fetch(), que não existe na classe base Animal.
class Animal {
constructor(name) {
this.name = name;
}
speak() {
console.log(`${this.name} makes a noise.`);
}
}
class Dog extends Animal {
speak() {
console.log(`${this.name} barks.`);
}
fetch() {
console.log(`${this.name} is fetching.`);
}
}
const dog = new Dog('Rex');
dog.speak(); // "Rex barks."
dog.fetch(); // "Rex is fetching."
7.5 Verificando Herança
Para verificar a herança, você pode usar o operador instanceof e o método isPrototypeOf().
Exemplo:
O operador instanceof verifica se um objeto é uma instância de uma classe. O método isPrototypeOf() verifica se o protótipo de um objeto é parte da cadeia de protótipos de outro objeto.
console.log(dog instanceof Dog); // true
console.log(dog instanceof Animal); // true
console.log(Animal.prototype.isPrototypeOf(Dog.prototype)); // true
GO TO FULL VERSION