-
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]