Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Aprenda Compreendendo Herança com Extends e Super() | Dominando Classes e Herança em JavaScript
Domínio Avançado de JavaScript

bookCompreendendo Herança com Extends e Super()

O que é Herança de Classe?

JavaScript utiliza a palavra-chave extends para estabelecer essa relação entre classes. Uma classe filha pode adicionar suas próprias propriedades e métodos ou sobrescrever aqueles da classe pai.

Considere uma classe filha como uma versão especializada da classe pai. Se a classe pai é um modelo para um carro, a classe filha pode representar um tipo específico de carro, como um carro elétrico. O carro elétrico herda a funcionalidade básica (rodas, direção), mas pode adicionar ou modificar recursos (bateria, sistema de carregamento).

Como usar a palavra-chave extends

A palavra-chave extends é utilizada para fazer uma classe herdar de outra classe. A classe filha herda todas as propriedades e métodos da classe pai.

1234567891011121314151617181920
class Animal { constructor(name) { this.name = name; } makeSound() { console.log(`${this.name} makes a sound.`); } } // Child class extending the Animal class class Dog extends Animal { bark() { console.log(`${this.name} barks!`); } } const dog = new Dog('Rex'); dog.makeSound(); // Output: Rex makes a sound. dog.bark(); // Output: Rex barks!
copy

Neste exemplo, a classe Dog estende a classe Animal, herdando o método makeSound() da classe pai. A classe Dog também adiciona seu próprio método bark().

Trabalhando com o Construtor em uma Classe Filha

Ao criar uma classe filha, geralmente é necessário inicializar suas próprias propriedades, bem como as da classe pai. Isso é feito através do método constructor. No entanto, para garantir que a classe pai seja devidamente inicializada, é obrigatório utilizar a função super() para chamar o construtor da classe pai.

Importante: Quando uma classe filha possui um construtor, ela deve chamar super() antes de acessar this, caso contrário ocorrerá um erro.

Utilizando super() para Chamar o Construtor da Classe Pai

A função super() é utilizada para chamar o construtor da classe pai a partir do construtor da classe filha. Isso garante que quaisquer propriedades ou lógicas definidas no construtor da classe pai sejam corretamente inicializadas antes de adicionar novas funcionalidades na classe filha.

1234567891011121314151617181920212223242526
class Animal { constructor(name) { this.name = name; } makeSound() { console.log(`${this.name} makes a sound.`); } } // Child class with its own constructor class Dog extends Animal { constructor(name, breed) { // Call the parent class constructor using super() super(name); this.breed = breed; } bark() { console.log(`${this.name}, the ${this.breed}, barks!`); } } const dog = new Dog('Rex', 'German Shepherd'); dog.makeSound(); // Output: Rex makes a sound. dog.bark(); // Output: Rex, the German Shepherd, barks!
copy

Neste exemplo, temos uma classe base chamada Animal com um construtor que inicializa a propriedade name e um método makeSound que registra uma mensagem genérica de som. A classe Dog estende Animal, adicionando seu próprio construtor que aceita tanto name quanto breed como argumentos. Dentro do construtor de Dog, a função super() é utilizada para chamar o construtor da classe pai, garantindo que name seja definido corretamente. Além disso, Dog introduz um novo método, bark, que registra uma mensagem específica para a raça do cachorro. Ao criar uma nova instância de Dog chamada Rex da raça German Shepherd, é possível chamar tanto makeSound quanto bark, demonstrando o comportamento herdado e o novo comportamento.

Pontos-chave ao usar extends e super()

Herança: A palavra-chave extends permite que a classe filha herde propriedades e métodos da classe pai.

Construtor na Classe Filha: Ao definir um construtor na classe filha, sempre utilize super() para chamar o construtor da classe pai.

Acessando this: É necessário chamar super() antes de acessar this no construtor da classe filha.

Sobrescrita de Métodos: É possível sobrescrever métodos da classe pai na classe filha definindo um método com o mesmo nome. Também é possível utilizar super.methodName() para chamar o método da classe pai a partir da classe filha, se necessário.

Exemplo: Sobrescrita de Métodos e Uso de super()

Em algumas situações, pode ser necessário sobrescrever um método da classe pai na classe filha, mas ainda assim chamar o método da classe pai como parte da nova lógica. Isso pode ser feito utilizando super.methodName().

1234567891011121314151617181920212223242526272829
class Animal { constructor(name) { this.name = name; } makeSound() { console.log(`${this.name} makes a generic sound.`); } } class Dog extends Animal { constructor(name, breed) { super(name); this.breed = breed; } // Override the makeSound method makeSound() { // Call the parent class's makeSound method super.makeSound(); console.log(`${this.name}, the ${this.breed}, barks loudly.`); } } const dog = new Dog('Rex', 'German Shepherd'); dog.makeSound(); // Output: // Rex makes a generic sound. // Rex, the German Shepherd, barks loudly.
copy

Neste exemplo, a classe Dog sobrescreve o método makeSound, mas ainda chama o método makeSound da classe pai utilizando super.makeSound(). Isso permite que a classe filha estenda o comportamento da classe pai sem substituí-lo completamente.

Exemplo do Mundo Real: Classes Employee e Manager

Considere um cenário em que existe uma classe Employee e uma classe Manager que a estende. A classe Manager adiciona novas funcionalidades além das funcionalidades básicas de Employee.

12345678910111213141516171819202122232425262728
class Employee { constructor(name, position) { this.name = name; this.position = position; } getDetails() { return `${this.name} works as a ${this.position}.`; } } class Manager extends Employee { constructor(name, position, department) { // Call the parent class constructor using super() super(name, position); this.department = department; } getDetails() { return `${super.getDetails()} They manage the ${ this.department } department.`; } } const manager = new Manager('Alice', 'Manager', 'Sales'); console.log(manager.getDetails()); // Output: Alice works as a Manager. They manage the Sales department.
copy

Neste exemplo, a classe Manager estende a classe Employee, adicionando uma nova propriedade department. O método getDetails() na classe Manager chama o método da classe pai utilizando super.getDetails() e, em seguida, acrescenta informações específicas do departamento.

1. O que a palavra-chave extends faz?

2. Em uma classe filha, por que usamos super() no construtor?

3. Qual será a saída do seguinte código?

question mark

O que a palavra-chave extends faz?

Select the correct answer

question mark

Em uma classe filha, por que usamos super() no construtor?

Select the correct answer

question mark

Qual será a saída do seguinte código?

Select the correct answer

Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

Seção 1. Capítulo 14

Pergunte à IA

expand

Pergunte à IA

ChatGPT

Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo

Awesome!

Completion rate improved to 2.22

bookCompreendendo Herança com Extends e Super()

Deslize para mostrar o menu

O que é Herança de Classe?

JavaScript utiliza a palavra-chave extends para estabelecer essa relação entre classes. Uma classe filha pode adicionar suas próprias propriedades e métodos ou sobrescrever aqueles da classe pai.

Considere uma classe filha como uma versão especializada da classe pai. Se a classe pai é um modelo para um carro, a classe filha pode representar um tipo específico de carro, como um carro elétrico. O carro elétrico herda a funcionalidade básica (rodas, direção), mas pode adicionar ou modificar recursos (bateria, sistema de carregamento).

Como usar a palavra-chave extends

A palavra-chave extends é utilizada para fazer uma classe herdar de outra classe. A classe filha herda todas as propriedades e métodos da classe pai.

1234567891011121314151617181920
class Animal { constructor(name) { this.name = name; } makeSound() { console.log(`${this.name} makes a sound.`); } } // Child class extending the Animal class class Dog extends Animal { bark() { console.log(`${this.name} barks!`); } } const dog = new Dog('Rex'); dog.makeSound(); // Output: Rex makes a sound. dog.bark(); // Output: Rex barks!
copy

Neste exemplo, a classe Dog estende a classe Animal, herdando o método makeSound() da classe pai. A classe Dog também adiciona seu próprio método bark().

Trabalhando com o Construtor em uma Classe Filha

Ao criar uma classe filha, geralmente é necessário inicializar suas próprias propriedades, bem como as da classe pai. Isso é feito através do método constructor. No entanto, para garantir que a classe pai seja devidamente inicializada, é obrigatório utilizar a função super() para chamar o construtor da classe pai.

Importante: Quando uma classe filha possui um construtor, ela deve chamar super() antes de acessar this, caso contrário ocorrerá um erro.

Utilizando super() para Chamar o Construtor da Classe Pai

A função super() é utilizada para chamar o construtor da classe pai a partir do construtor da classe filha. Isso garante que quaisquer propriedades ou lógicas definidas no construtor da classe pai sejam corretamente inicializadas antes de adicionar novas funcionalidades na classe filha.

1234567891011121314151617181920212223242526
class Animal { constructor(name) { this.name = name; } makeSound() { console.log(`${this.name} makes a sound.`); } } // Child class with its own constructor class Dog extends Animal { constructor(name, breed) { // Call the parent class constructor using super() super(name); this.breed = breed; } bark() { console.log(`${this.name}, the ${this.breed}, barks!`); } } const dog = new Dog('Rex', 'German Shepherd'); dog.makeSound(); // Output: Rex makes a sound. dog.bark(); // Output: Rex, the German Shepherd, barks!
copy

Neste exemplo, temos uma classe base chamada Animal com um construtor que inicializa a propriedade name e um método makeSound que registra uma mensagem genérica de som. A classe Dog estende Animal, adicionando seu próprio construtor que aceita tanto name quanto breed como argumentos. Dentro do construtor de Dog, a função super() é utilizada para chamar o construtor da classe pai, garantindo que name seja definido corretamente. Além disso, Dog introduz um novo método, bark, que registra uma mensagem específica para a raça do cachorro. Ao criar uma nova instância de Dog chamada Rex da raça German Shepherd, é possível chamar tanto makeSound quanto bark, demonstrando o comportamento herdado e o novo comportamento.

Pontos-chave ao usar extends e super()

Herança: A palavra-chave extends permite que a classe filha herde propriedades e métodos da classe pai.

Construtor na Classe Filha: Ao definir um construtor na classe filha, sempre utilize super() para chamar o construtor da classe pai.

Acessando this: É necessário chamar super() antes de acessar this no construtor da classe filha.

Sobrescrita de Métodos: É possível sobrescrever métodos da classe pai na classe filha definindo um método com o mesmo nome. Também é possível utilizar super.methodName() para chamar o método da classe pai a partir da classe filha, se necessário.

Exemplo: Sobrescrita de Métodos e Uso de super()

Em algumas situações, pode ser necessário sobrescrever um método da classe pai na classe filha, mas ainda assim chamar o método da classe pai como parte da nova lógica. Isso pode ser feito utilizando super.methodName().

1234567891011121314151617181920212223242526272829
class Animal { constructor(name) { this.name = name; } makeSound() { console.log(`${this.name} makes a generic sound.`); } } class Dog extends Animal { constructor(name, breed) { super(name); this.breed = breed; } // Override the makeSound method makeSound() { // Call the parent class's makeSound method super.makeSound(); console.log(`${this.name}, the ${this.breed}, barks loudly.`); } } const dog = new Dog('Rex', 'German Shepherd'); dog.makeSound(); // Output: // Rex makes a generic sound. // Rex, the German Shepherd, barks loudly.
copy

Neste exemplo, a classe Dog sobrescreve o método makeSound, mas ainda chama o método makeSound da classe pai utilizando super.makeSound(). Isso permite que a classe filha estenda o comportamento da classe pai sem substituí-lo completamente.

Exemplo do Mundo Real: Classes Employee e Manager

Considere um cenário em que existe uma classe Employee e uma classe Manager que a estende. A classe Manager adiciona novas funcionalidades além das funcionalidades básicas de Employee.

12345678910111213141516171819202122232425262728
class Employee { constructor(name, position) { this.name = name; this.position = position; } getDetails() { return `${this.name} works as a ${this.position}.`; } } class Manager extends Employee { constructor(name, position, department) { // Call the parent class constructor using super() super(name, position); this.department = department; } getDetails() { return `${super.getDetails()} They manage the ${ this.department } department.`; } } const manager = new Manager('Alice', 'Manager', 'Sales'); console.log(manager.getDetails()); // Output: Alice works as a Manager. They manage the Sales department.
copy

Neste exemplo, a classe Manager estende a classe Employee, adicionando uma nova propriedade department. O método getDetails() na classe Manager chama o método da classe pai utilizando super.getDetails() e, em seguida, acrescenta informações específicas do departamento.

1. O que a palavra-chave extends faz?

2. Em uma classe filha, por que usamos super() no construtor?

3. Qual será a saída do seguinte código?

question mark

O que a palavra-chave extends faz?

Select the correct answer

question mark

Em uma classe filha, por que usamos super() no construtor?

Select the correct answer

question mark

Qual será a saída do seguinte código?

Select the correct answer

Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

Seção 1. Capítulo 14
some-alt