2021-06-15 00:49:18 -07:00
---
id: 587d7db1367417b2b2512b87
2021-07-21 20:53:20 +05:30
title: Adicionar métodos após a herança
2021-06-15 00:49:18 -07:00
challengeType: 1
forumTopicId: 301315
dashedName: add-methods-after-inheritance
---
# --description--
2021-07-30 23:57:21 +09:00
Uma função construtora, ou simplesmente construtor, que herda seu objeto de `prototype` de uma função construtora de supertipo, além dos métodos herdados, ainda poderá ter seus próprios métodos.
2021-06-15 00:49:18 -07:00
2021-07-30 23:57:21 +09:00
Por exemplo, `Bird` é um construtor que herda seu `prototype` de `Animal` :
2021-06-15 00:49:18 -07:00
```js
function Animal() { }
Animal.prototype.eat = function() {
console.log("nom nom nom");
};
function Bird() { }
Bird.prototype = Object.create(Animal.prototype);
Bird.prototype.constructor = Bird;
```
2021-07-30 23:57:21 +09:00
Como adicional do que é herdado da classe `Animal` , você deseja adicionar o comportamento que é único de objetos `Bird` . Aqui, `Bird` definirá a função `fly()` . As funções são adicionadas ao `Bird's` `prototype` (protótipo do pássaro) da mesma forma que qualquer função construtora:
2021-06-15 00:49:18 -07:00
```js
Bird.prototype.fly = function() {
console.log("I'm flying!");
};
```
2021-07-16 11:03:16 +05:30
Agora as instâncias de `Bird` terão ambos os métodos, `eat()` e `fly()` :
2021-06-15 00:49:18 -07:00
```js
let duck = new Bird();
duck.eat();
duck.fly();
```
2021-07-16 11:03:16 +05:30
`duck.eat()` exibe no console a string `nom nom nom` , e `duck.fly()` mostra a string `I'm flying!` .
2021-06-15 00:49:18 -07:00
# --instructions--
2021-07-30 23:57:21 +09:00
Adiciona todos os códigos necessários para que o objeto `Dog` herde de `Animal` e o `prototype` de construtor de `Dog` está definido para `Dog` . Então adiciona o método `bark()` para o objeto `Dog` para que um `beagle` possa `eat()` e `bark()` . O método `bark()` deveria imprimir no console a string: `Woof!` .
2021-06-15 00:49:18 -07:00
# --hints--
2021-07-16 11:03:16 +05:30
`Animal` não deve possuir o método `bark()` .
2021-06-15 00:49:18 -07:00
```js
assert(typeof Animal.prototype.bark == 'undefined');
```
2021-07-16 11:03:16 +05:30
`Dog` deve herdar o método `eat()` de `Animal` .
2021-06-15 00:49:18 -07:00
```js
assert(typeof Dog.prototype.eat == 'function');
```
2021-07-16 11:03:16 +05:30
O protótipo de `Dog` deve ter o método `bark()` .
2021-06-15 00:49:18 -07:00
```js
assert('bark' in Dog.prototype);
```
2021-07-30 23:57:21 +09:00
`beagle` deve ser uma `instanceof` de `Animal` .
2021-06-15 00:49:18 -07:00
```js
assert(beagle instanceof Animal);
```
2021-07-16 11:03:16 +05:30
O construtor para `beagle` deve ser definido para `Dog` .
2021-06-15 00:49:18 -07:00
```js
assert(beagle.constructor === Dog);
```
2021-07-16 11:03:16 +05:30
`beagle.eat()` deve mostrar no console a string `nom nom nom`
2021-06-15 00:49:18 -07:00
```js
console.log = function (msg) {
throw msg;
};
assert.throws(() => beagle.eat(), 'nom nom nom');
```
2021-10-07 09:08:50 -07:00
`beagle.bark()` deve mostrar no console a string `Woof!`
2021-06-15 00:49:18 -07:00
```js
console.log = function (msg) {
throw msg;
};
assert.throws(() => beagle.bark(), 'Woof!');
```
# --seed--
## --seed-contents--
```js
function Animal() { }
Animal.prototype.eat = function() { console.log("nom nom nom"); };
function Dog() { }
// Only change code below this line
// Only change code above this line
let beagle = new Dog();
```
# --solutions--
```js
function Animal() { }
Animal.prototype.eat = function() { console.log("nom nom nom"); };
function Dog() { }
Dog.prototype = Object.create(Animal.prototype);
Dog.prototype.constructor = Dog;
Dog.prototype.bark = function () {
console.log('Woof!');
};
let beagle = new Dog();
beagle.eat();
beagle.bark();
```