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]