Médio JavaScript
Cadeia de protótipos com função construtora
Enunciado
Crie uma função construtora Animal que recebe nome e define this.nome. No Animal.prototype, adicione o método falar() que retorna "<nome> faz um som". Crie uma função construtora Cachorro que herda de Animal usando Object.create(Animal.prototype), e no Cachorro.prototype sobrescreva falar() para retornar "<nome> late". Crie uma instância rex = new Cachorro('Rex') e imprima rex.falar() e rex instanceof Animal.
Requisitos
- Usar função construtora
Animalcom propriedadenome. Animal.prototype.falardeve retornar'<nome> faz um som'.Cachorrodeve herdar deAnimalviaObject.create(Animal.prototype).Cachorro.prototype.falardeve retornar'<nome> late'.- Imprimir
rex.falar()erex instanceof Animal.
Código inicial
function Animal(nome) {
// complete
}
// Adicione falar ao prototype
function Cachorro(nome) {
// complete
}
// Configure herança e sobrescreva falar
// Crie rex e imprima
Saída esperada
Rex late
true
Ver dica
Dentro do construtor Cachorro, chame Animal.call(this, nome) para inicializar this.nome. Depois, Cachorro.prototype = Object.create(Animal.prototype) e redefina Cachorro.prototype.constructor = Cachorro.
Mostrar solução
function Animal(nome) {
this.nome = nome;
}
Animal.prototype.falar = function() {
return `${this.nome} faz um som`;
};
function Cachorro(nome) {
Animal.call(this, nome); // chama o construtor pai
}
// Herda de Animal
Cachorro.prototype = Object.create(Animal.prototype);
Cachorro.prototype.constructor = Cachorro;
// Sobrescreve falar
Cachorro.prototype.falar = function() {
return `${this.nome} late`;
};
const rex = new Cachorro('Rex');
console.log(rex.falar());
console.log(rex instanceof Animal);
Passo a passo
Animalé uma função construtora que inicializathis.nome.Animal.prototype.falardefine o método compartilhado.CachorrochamaAnimal.call(this, nome)para reutilizar a inicialização.Cachorro.prototype = Object.create(Animal.prototype)cria a cadeia de protótipos.- Redefinimos
Cachorro.prototype.constructorpara não perder a referência. - Sobrescrevemos
falarno protótipo deCachorro. rexé criado comnew Cachorro('Rex')e herda deCachorro.prototype, que herda deAnimal.prototype.rex.falar()usa o método sobrescrito;rex instanceof Animalverifica a cadeia.
Por que funciona
A herança prototípica é montada manualmente: Cachorro.prototype tem como protótipo Animal.prototype. Assim, rex acessa falar em Cachorro.prototype e, se não existisse, subiria para Animal.prototype. O instanceof percorre a cadeia e encontra Animal.prototype.
Erros comuns
- Esquecer
Animal.call(this, nome)—this.nomeficaundefined. - Fazer
Cachorro.prototype = Animal.prototype— ambos compartilham o mesmo protótipo; sobrescreverfalarafetaAnimaltambém. - Não redefinir
constructor—rex.constructorapontaria paraAnimal.
Outra forma de resolver
Com classes ES6:
class Animal {
constructor(nome) { this.nome = nome; }
falar() { return `${this.nome} faz um som`; }
}
class Cachorro extends Animal {
falar() { return `${this.nome} late`; }
}
É mais legível, mas internamente usa a mesma cadeia de protótipos.
Saída esperada
Rex late
true