Estamos de volta com nosso programa que cria Winstons
mas eu adicionei um novo tipo de objeto Hopper porque Hopper estava se sentindo
um pouco deixado de lado.
Eu defino Hopper do mesmo jeito que eu defino Winston,
começando pelo construtor e recebendo as mesmas propriedades e então draw
e talk e eu também adicionei outro método chamado Horray
porque Hoppers realmente gostam de comemorar e Winstons não mesmo.
No final da função, eu criei dois novos objetos Hopper: lilHopper e bigHopper
e chamei draw nos dois e talk em um e Horray no outro.
Está bem arrumado.
Agora, se olharmos esse código aqui em cima,
você talvez note algo interessante.
O código do Hopper é muito similar ao código do Winston.
Particularmente, veja seu construtor.
Não sei se você se lembra mas é exatamente o mesmo código do construtor de Winston.
E essa função talk é também exatamente o mesmo código da função talk do Winston.
E ambos possuem a função draw.
Então há muito em comum entre esses dois tipos de objetos e isso faz sentido
porque você sabe que Hopper e Winston são dois tipos muito similares de objeto.
E, se você pensar sobre o mundo real fora do computador,
a maioria dos objetos compartilha similaridades com outros tipos de objeto.
Como no reino animal, todos os animais são similares de alguma forma.
E temos diferentes tipos de animais como os humanos.
E humanos compartilham dessas semelhanças mas também tem suas próprias propriedades.
Então podemos dizer que animal é um tipo de objeto
de que o tipo de objeto humano herda funcionalidades.
Não começamos completamente do zero,
adicionamos funcionalidades por cima das que temos por ser um tipo de animal.
Como todos os animais fazem sons, mas humanos também fazem a linguagem.
Então esse conceito de herança de objetos é realmente útil na programação também.
E nós podemos criar uma cadeia de herança de objetos em nosso Javascript.
Então pra fazer isso nós precisamos pensar
sobre o que é compartilhada por nossos tipos de objeto.
E inventar um nome pra isso.
Porque vamos criar um novo tipo de objeto que represente o objeto base.
Vamos chamá-los de criaturas.
Ambos são criaturas.
Então dizemos varCreature é igual a... E agora precisamos da função construtora.
Então vamos pegar do Hopper já que é a mesma que Winston tem.
Certo.
E então... Vamos ver.
Agora nós queremos... O que queremos fazer em sequência?
Talvez queiramos adicionar a função talk.
A função talk apenas pegamos do Hopper.
Mas, é claro, precisamos dela no protótipo de criatura.
Então agora temos esse tipo de objeto Creature
Mas precisamos dizer a Hopper
que Hopper deveria basear sua funcionalidade em Creature.
Podemos fazer isso escrevendo esta linha aqui.
Vamos dizer Hopper.prototype é igual a Object.create(Creature.prototype)
Essa linha diz ao Javascript para basear o protótipo do Hopper, ou seja,
basear toda a funcionalidade do Hopper sobre o protótipo de criatura.
Isso significa que toda vez que ele procurar uma função em um Hopper,
procurará no protótipo de Hopper primeiro,
mas se não achar o que está procurando, vai procurar no protótipo de criatura.
E isso é o que chamamos de cadeia de protótipos.
Um vez que já fizemos isso, poderíamos deletar a função talk do Hopper.
Porque ela já existe em criatura que está acima na cadeia de protótipos.
Então vamos testar.
Funciona!
E funciona porque a acha no protótipo de criatura.
Vamos tentar deletar do Winston também.
Não funcionou, aqui diz que o objeto não tem o método talk.
E por que isso? Bem, nós temos o construtor de Winston e a função draw
e tiramos a função talk.
Pode-se notar que esquecemos de dizer na verdade que o protótipo de Winston
deve se basear no protótipo de criatura. Precisamos daquela linha muito importante.
Winston.prototype = Object.create(Creature.prototype)
E repare num ponto importante.
Eu tenho essa linha depois da função do construtor mas antes de adicionar qualquer
outra coisa ao protótipo do Winston. Isso é o que você geralmente quer fazer.
Você quer dizer que assim que você estiver começando,
é nisso que seu protótipo inicial vai ser baseado.
Mas então podemos continuar adicionando coisas ao seu protótipo.
Porque pode haver algo que é único aos Winstons ou único aos Hoppers
que outras criatura não tem.
E isso não tem problema, você pode definir essas coisas.
Agora, se olharmos, ainda temos algumas partes de código repetidas.
O código do construtor.
Temos ele todas as três vezes.
Então poderíamos apenas deletá-lo?
Vamos tentar.
Não parece que isso funcionou.
Porque nosso Hopper aparecer lá em cima no canto esquerdo e esqueceu tudo sobre si.
E isso é porque JavaScritpt não assume que você quer o mesmo construtor mesmo que
você queira basear o protótipo nele.
Você sabe, você pode definir seu próprio construtor para esses objetos.
Mas você também tem um jeito fácil de chamar um construtor dentro de um objeto.
Então o jeito que podemos fazer isso é escrevendo
Creature.call(this, nickname, age, x, y)
O que isso faz, note que funcionou.
E o que isso fez foi realmente chamar a função da criatura, a função construtora.
Está chamando essa função mas está chamando e dizendo você deveria chamar
a função construtora como se ela estivesse sendo chamada de um objeto Hopper.
E como se ela estivesse sendo chamada com esses argumentos.
E esses são os argumentos com que Hopper foi chamado.
E, no fim, o código vai ser executado como se estivesse logo aqui.
E isso é exatamente o que queremos. E funcionou!
E podemos ir a frente e copiar essa linha dentro do construtor do Winston também.
E funciona!
Então olhe aqui, encapsulamos todas as propriedades compartilhadas e
funcionalidades dos nossos objetos em um único tipo de objeto base, criatura.
E fizemos dois tipos de objeto que se estendem deste objeto base.
Eles herdam funcionalidades mas também adicionam suas próprias.
E o mais legal sobre isso é que
podemos alterar a funcionalidade compartilhada em um único lugar.
Por exemplo, se quiséssemos mudar a idade de novo,
poderíamos dizer: mais "anos de idade".
Agora todo mundo tem "anos de idade".
Ou poderíamos mudar a função talk. E agora Winstons e Hoppers estão dizendo "sup".
Então agora que você viu como criar tipos de objeto e herdar de tipos de objetos,
você pode começar a pensar como isso
pode ser útil em nossos desenhos e animações e simulações e jogos.
Por exemplo, talvez você tenha um jogo e tenha vários tipos de personagens nele
e todos eles podem correr mas somente alguns podem pular.
É um lugar perfeito pra alguns tipos de objeto e algumas heranças.
Mas eu aposto que você pode pensar em uma tonelada de outros jeitos também.
Legendado por [Alberto Oliveira] Revisado por [Fernando dos Reis]