0:00:00.897,0:00:03.523
Estamos de volta com nosso[br]programa que cria Winstons
0:00:03.523,0:00:07.329
mas eu adicionei um novo tipo de objeto[br]Hopper porque Hopper estava se sentindo
0:00:07.329,0:00:08.667
um pouco deixado de lado.
0:00:08.667,0:00:11.755
Eu defino Hopper do mesmo[br]jeito que eu defino Winston,
0:00:11.755,0:00:15.923
começando pelo construtor e recebendo[br]as mesmas propriedades e então draw
0:00:15.923,0:00:21.008
e talk e eu também adicionei[br]outro método chamado Horray
0:00:21.008,0:00:24.508
porque Hoppers realmente gostam de[br]comemorar e Winstons não mesmo.
0:00:25.328,0:00:31.164
No final da função, eu criei dois novos[br]objetos Hopper: lilHopper e bigHopper
0:00:31.164,0:00:35.347
e chamei draw nos dois e talk[br]em um e Horray no outro.
0:00:36.167,0:00:37.618
Está bem arrumado.
0:00:37.618,0:00:40.128
Agora, se olharmos esse[br]código aqui em cima,
0:00:40.128,0:00:42.803
você talvez note algo interessante.
0:00:42.863,0:00:47.128
O código do Hopper é muito similar[br]ao código do Winston.
0:00:47.128,0:00:49.174
Particularmente, veja seu construtor.
0:00:49.174,0:00:54.605
Não sei se você se lembra mas é exatamente[br]o mesmo código do construtor de Winston.
0:00:54.765,0:01:00.376
E essa função talk é também exatamente[br]o mesmo código da função talk do Winston.
0:01:01.116,0:01:03.897
E ambos possuem a função draw.
0:01:03.897,0:01:08.182
Então há muito em comum entre esses[br]dois tipos de objetos e isso faz sentido
0:01:08.182,0:01:12.271
porque você sabe que Hopper e Winston[br]são dois tipos muito similares de objeto.
0:01:12.271,0:01:16.989
E, se você pensar sobre o [br]mundo real fora do computador,
0:01:16.989,0:01:20.773
a maioria dos objetos compartilha[br]similaridades com outros tipos de objeto.
0:01:20.773,0:01:25.213
Como no reino animal, todos os animais[br]são similares de alguma forma.
0:01:25.213,0:01:28.372
E temos diferentes tipos de [br]animais como os humanos.
0:01:28.372,0:01:34.358
E humanos compartilham dessas semelhanças[br]mas também tem suas próprias propriedades.
0:01:34.358,0:01:37.906
Então podemos dizer que animal[br]é um tipo de objeto
0:01:37.906,0:01:41.564
de que o tipo de objeto humano[br]herda funcionalidades.
0:01:41.564,0:01:43.338
Não começamos completamente do zero,
0:01:43.338,0:01:46.952
adicionamos funcionalidades por cima das[br]que temos por ser um tipo de animal.
0:01:46.952,0:01:51.316
Como todos os animais fazem sons,[br]mas humanos também fazem a linguagem.
0:01:51.876,0:01:56.355
Então esse conceito de herança de objetos[br]é realmente útil na programação também.
0:01:56.355,0:02:00.105
E nós podemos criar uma cadeia de herança[br]de objetos em nosso Javascript.
0:02:00.105,0:02:02.299
Então pra fazer isso nós precisamos pensar
0:02:02.299,0:02:05.035
sobre o que é compartilhada[br]por nossos tipos de objeto.
0:02:05.035,0:02:06.633
E inventar um nome pra isso.
0:02:06.633,0:02:10.675
Porque vamos criar um novo tipo de objeto[br]que represente o objeto base.
0:02:10.675,0:02:12.224
Vamos chamá-los de criaturas.
0:02:12.224,0:02:13.783
Ambos são criaturas.
0:02:13.783,0:02:17.951
Então dizemos varCreature é igual a...[br]E agora precisamos da função construtora.
0:02:17.951,0:02:22.602
Então vamos pegar do Hopper já [br]que é a mesma que Winston tem.
0:02:22.602,0:02:23.602
Certo.
0:02:23.602,0:02:26.532
E então... Vamos ver.
0:02:26.532,0:02:29.336
Agora nós queremos...[br]O que queremos fazer em sequência?
0:02:29.336,0:02:32.406
Talvez queiramos adicionar a função talk.
0:02:33.516,0:02:36.018
A função talk apenas pegamos do Hopper.[br]
0:02:36.018,0:02:39.380
Mas, é claro, precisamos dela[br]no protótipo de criatura.
0:02:41.273,0:02:45.620
Então agora temos esse[br]tipo de objeto Creature
0:02:45.620,0:02:48.090
Mas precisamos dizer a Hopper
0:02:48.090,0:02:52.716
que Hopper deveria basear sua[br]funcionalidade em Creature.
0:02:52.716,0:02:56.055
Podemos fazer isso[br]escrevendo esta linha aqui.
0:02:56.055,0:03:04.997
Vamos dizer Hopper.prototype é igual a[br]Object.create(Creature.prototype)
0:03:04.997,0:03:09.798
Essa linha diz ao Javascript para basear[br]o protótipo do Hopper, ou seja,
0:03:09.798,0:03:14.629
basear toda a funcionalidade do Hopper[br]sobre o protótipo de criatura.
0:03:14.629,0:03:20.152
Isso significa que toda vez que ele[br]procurar uma função em um Hopper,
0:03:20.152,0:03:22.769
procurará no protótipo de Hopper primeiro,
0:03:22.769,0:03:27.146
mas se não achar o que está procurando,[br]vai procurar no protótipo de criatura.
0:03:27.146,0:03:30.052
E isso é o que chamamos[br]de cadeia de protótipos.
0:03:30.052,0:03:35.304
Um vez que já fizemos isso, poderíamos[br]deletar a função talk do Hopper.
0:03:35.304,0:03:38.946
Porque ela já existe em criatura[br]que está acima na cadeia de protótipos.
0:03:38.946,0:03:40.128
Então vamos testar.
0:03:41.818,0:03:42.781
Funciona!
0:03:42.781,0:03:47.284
E funciona porque a acha[br]no protótipo de criatura.
0:03:48.834,0:03:51.894
Vamos tentar deletar do Winston também.
0:03:54.324,0:03:57.920
Não funcionou, aqui diz que o objeto[br]não tem o método talk.
0:03:57.920,0:04:01.613
E por que isso? Bem, nós temos o[br]construtor de Winston e a função draw
0:04:01.613,0:04:02.917
e tiramos a função talk.
0:04:02.917,0:04:06.444
Pode-se notar que esquecemos de dizer[br]na verdade que o protótipo de Winston
0:04:06.444,0:04:10.349
deve se basear no protótipo de criatura.[br]Precisamos daquela linha muito importante.
0:04:10.349,0:04:15.561
Winston.prototype = [br]Object.create(Creature.prototype)
0:04:19.000,0:04:20.426
E repare num ponto importante.
0:04:20.426,0:04:24.977
Eu tenho essa linha depois da função do[br]construtor mas antes de adicionar qualquer
0:04:24.977,0:04:28.614
outra coisa ao protótipo do Winston.[br]Isso é o que você geralmente quer fazer.
0:04:28.614,0:04:31.230
Você quer dizer que assim[br]que você estiver começando,
0:04:31.230,0:04:34.050
é nisso que seu protótipo[br]inicial vai ser baseado.
0:04:34.050,0:04:37.124
Mas então podemos continuar [br]adicionando coisas ao seu protótipo.
0:04:37.124,0:04:41.473
Porque pode haver algo que é único aos[br]Winstons ou único aos Hoppers
0:04:41.473,0:04:43.009
que outras criatura não tem.
0:04:43.009,0:04:45.765
E isso não tem problema,[br]você pode definir essas coisas.
0:04:46.485,0:04:49.976
Agora, se olharmos, ainda temos[br]algumas partes de código repetidas.
0:04:49.976,0:04:51.524
O código do construtor.
0:04:51.524,0:04:53.366
Temos ele todas as três vezes.
0:04:53.366,0:04:56.638
Então poderíamos[br]apenas deletá-lo?
0:04:57.918,0:04:59.410
Vamos tentar.
0:05:00.870,0:05:03.439
Não parece que isso funcionou.
0:05:03.439,0:05:07.500
Porque nosso Hopper aparecer lá em cima no[br]canto esquerdo e esqueceu tudo sobre si.
0:05:07.500,0:05:12.994
E isso é porque JavaScritpt não assume que[br]você quer o mesmo construtor mesmo que
0:05:12.994,0:05:15.859
você queira basear o protótipo nele.
0:05:16.019,0:05:19.491
Você sabe, você pode definir seu[br]próprio construtor para esses objetos.
0:05:19.491,0:05:26.043
Mas você também tem um jeito fácil de[br]chamar um construtor dentro de um objeto.
0:05:26.043,0:05:28.306
Então o jeito que podemos[br]fazer isso é escrevendo
0:05:28.306,0:05:35.470
Creature.call(this, nickname, age, x, y)
0:05:36.400,0:05:39.528
O que isso faz, note que funcionou.
0:05:39.528,0:05:44.619
E o que isso fez foi realmente chamar a[br]função da criatura, a função construtora.
0:05:44.619,0:05:48.339
Está chamando essa função mas está[br]chamando e dizendo você deveria chamar
0:05:48.339,0:05:53.694
a função construtora como se ela estivesse[br]sendo chamada de um objeto Hopper.
0:05:53.694,0:05:56.928
E como se ela estivesse sendo[br]chamada com esses argumentos.
0:05:56.928,0:05:59.427
E esses são os argumentos com[br]que Hopper foi chamado.
0:05:59.827,0:06:03.679
E, no fim, o código vai ser executado[br]como se estivesse logo aqui.
0:06:03.679,0:06:06.577
E isso é exatamente o que[br]queremos. E funcionou!
0:06:06.577,0:06:13.919
E podemos ir a frente e copiar essa linha[br]dentro do construtor do Winston também.
0:06:15.069,0:06:16.531
E funciona!
0:06:17.371,0:06:20.561
Então olhe aqui, encapsulamos todas as[br]propriedades compartilhadas e
0:06:20.561,0:06:24.567
funcionalidades dos nossos objetos em um[br]único tipo de objeto base, criatura.
0:06:24.567,0:06:27.951
E fizemos dois tipos de objeto que[br]se estendem deste objeto base.
0:06:27.951,0:06:31.518
Eles herdam funcionalidades mas[br]também adicionam suas próprias.
0:06:31.718,0:06:33.395
E o mais legal sobre isso é que
0:06:33.395,0:06:36.442
podemos alterar a funcionalidade[br]compartilhada em um único lugar.
0:06:36.442,0:06:38.821
Por exemplo, se quiséssemos [br]mudar a idade de novo,
0:06:38.821,0:06:41.110
poderíamos dizer: mais "anos de idade".
0:06:41.510,0:06:43.991
Agora todo mundo tem "anos de idade".
0:06:44.101,0:06:52.472
Ou poderíamos mudar a função talk. E agora[br]Winstons e Hoppers estão dizendo "sup".
0:06:52.602,0:06:56.424
Então agora que você viu como criar tipos[br]de objeto e herdar de tipos de objetos,
0:06:56.424,0:06:58.168
você pode começar a pensar como isso[br]
0:06:58.168,0:07:01.267
pode ser útil em nossos desenhos[br]e animações e simulações e jogos.
0:07:01.267,0:07:04.973
Por exemplo, talvez você tenha um jogo e[br]tenha vários tipos de personagens nele
0:07:04.973,0:07:07.660
e todos eles podem correr mas[br]somente alguns podem pular.
0:07:07.660,0:07:11.660
É um lugar perfeito pra alguns tipos de[br]objeto e algumas heranças.
0:07:11.844,0:07:15.360
Mas eu aposto que você pode pensar em[br]uma tonelada de outros jeitos também.
0:07:15.360,0:07:17.000
Legendado por [Alberto Oliveira][br]Revisado por [Fernando dos Reis]