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]