1 00:00:00,897 --> 00:00:03,523 Estamos de volta com nosso programa que cria Winstons 2 00:00:03,523 --> 00:00:07,329 mas eu adicionei um novo tipo de objeto Hopper porque Hopper estava se sentindo 3 00:00:07,329 --> 00:00:08,667 um pouco deixado de lado. 4 00:00:08,667 --> 00:00:11,755 Eu defino Hopper do mesmo jeito que eu defino Winston, 5 00:00:11,755 --> 00:00:15,923 começando pelo construtor e recebendo as mesmas propriedades e então draw 6 00:00:15,923 --> 00:00:21,008 e talk e eu também adicionei outro método chamado Horray 7 00:00:21,008 --> 00:00:24,508 porque Hoppers realmente gostam de comemorar e Winstons não mesmo. 8 00:00:25,328 --> 00:00:31,164 No final da função, eu criei dois novos objetos Hopper: lilHopper e bigHopper 9 00:00:31,164 --> 00:00:35,347 e chamei draw nos dois e talk em um e Horray no outro. 10 00:00:36,167 --> 00:00:37,618 Está bem arrumado. 11 00:00:37,618 --> 00:00:40,128 Agora, se olharmos esse código aqui em cima, 12 00:00:40,128 --> 00:00:42,803 você talvez note algo interessante. 13 00:00:42,863 --> 00:00:47,128 O código do Hopper é muito similar ao código do Winston. 14 00:00:47,128 --> 00:00:49,174 Particularmente, veja seu construtor. 15 00:00:49,174 --> 00:00:54,605 Não sei se você se lembra mas é exatamente o mesmo código do construtor de Winston. 16 00:00:54,765 --> 00:01:00,376 E essa função talk é também exatamente o mesmo código da função talk do Winston. 17 00:01:01,116 --> 00:01:03,897 E ambos possuem a função draw. 18 00:01:03,897 --> 00:01:08,182 Então há muito em comum entre esses dois tipos de objetos e isso faz sentido 19 00:01:08,182 --> 00:01:12,271 porque você sabe que Hopper e Winston são dois tipos muito similares de objeto. 20 00:01:12,271 --> 00:01:16,989 E, se você pensar sobre o mundo real fora do computador, 21 00:01:16,989 --> 00:01:20,773 a maioria dos objetos compartilha similaridades com outros tipos de objeto. 22 00:01:20,773 --> 00:01:25,213 Como no reino animal, todos os animais são similares de alguma forma. 23 00:01:25,213 --> 00:01:28,372 E temos diferentes tipos de animais como os humanos. 24 00:01:28,372 --> 00:01:34,358 E humanos compartilham dessas semelhanças mas também tem suas próprias propriedades. 25 00:01:34,358 --> 00:01:37,906 Então podemos dizer que animal é um tipo de objeto 26 00:01:37,906 --> 00:01:41,564 de que o tipo de objeto humano herda funcionalidades. 27 00:01:41,564 --> 00:01:43,338 Não começamos completamente do zero, 28 00:01:43,338 --> 00:01:46,952 adicionamos funcionalidades por cima das que temos por ser um tipo de animal. 29 00:01:46,952 --> 00:01:51,316 Como todos os animais fazem sons, mas humanos também fazem a linguagem. 30 00:01:51,876 --> 00:01:56,355 Então esse conceito de herança de objetos é realmente útil na programação também. 31 00:01:56,355 --> 00:02:00,105 E nós podemos criar uma cadeia de herança de objetos em nosso Javascript. 32 00:02:00,105 --> 00:02:02,299 Então pra fazer isso nós precisamos pensar 33 00:02:02,299 --> 00:02:05,035 sobre o que é compartilhada por nossos tipos de objeto. 34 00:02:05,035 --> 00:02:06,633 E inventar um nome pra isso. 35 00:02:06,633 --> 00:02:10,675 Porque vamos criar um novo tipo de objeto que represente o objeto base. 36 00:02:10,675 --> 00:02:12,224 Vamos chamá-los de criaturas. 37 00:02:12,224 --> 00:02:13,783 Ambos são criaturas. 38 00:02:13,783 --> 00:02:17,951 Então dizemos varCreature é igual a... E agora precisamos da função construtora. 39 00:02:17,951 --> 00:02:22,602 Então vamos pegar do Hopper já que é a mesma que Winston tem. 40 00:02:22,602 --> 00:02:23,602 Certo. 41 00:02:23,602 --> 00:02:26,532 E então... Vamos ver. 42 00:02:26,532 --> 00:02:29,336 Agora nós queremos... O que queremos fazer em sequência? 43 00:02:29,336 --> 00:02:32,406 Talvez queiramos adicionar a função talk. 44 00:02:33,516 --> 00:02:36,018 A função talk apenas pegamos do Hopper. 45 00:02:36,018 --> 00:02:39,380 Mas, é claro, precisamos dela no protótipo de criatura. 46 00:02:41,273 --> 00:02:45,620 Então agora temos esse tipo de objeto Creature 47 00:02:45,620 --> 00:02:48,090 Mas precisamos dizer a Hopper 48 00:02:48,090 --> 00:02:52,716 que Hopper deveria basear sua funcionalidade em Creature. 49 00:02:52,716 --> 00:02:56,055 Podemos fazer isso escrevendo esta linha aqui. 50 00:02:56,055 --> 00:03:04,997 Vamos dizer Hopper.prototype é igual a Object.create(Creature.prototype) 51 00:03:04,997 --> 00:03:09,798 Essa linha diz ao Javascript para basear o protótipo do Hopper, ou seja, 52 00:03:09,798 --> 00:03:14,629 basear toda a funcionalidade do Hopper sobre o protótipo de criatura. 53 00:03:14,629 --> 00:03:20,152 Isso significa que toda vez que ele procurar uma função em um Hopper, 54 00:03:20,152 --> 00:03:22,769 procurará no protótipo de Hopper primeiro, 55 00:03:22,769 --> 00:03:27,146 mas se não achar o que está procurando, vai procurar no protótipo de criatura. 56 00:03:27,146 --> 00:03:30,052 E isso é o que chamamos de cadeia de protótipos. 57 00:03:30,052 --> 00:03:35,304 Um vez que já fizemos isso, poderíamos deletar a função talk do Hopper. 58 00:03:35,304 --> 00:03:38,946 Porque ela já existe em criatura que está acima na cadeia de protótipos. 59 00:03:38,946 --> 00:03:40,128 Então vamos testar. 60 00:03:41,818 --> 00:03:42,781 Funciona! 61 00:03:42,781 --> 00:03:47,284 E funciona porque a acha no protótipo de criatura. 62 00:03:48,834 --> 00:03:51,894 Vamos tentar deletar do Winston também. 63 00:03:54,324 --> 00:03:57,920 Não funcionou, aqui diz que o objeto não tem o método talk. 64 00:03:57,920 --> 00:04:01,613 E por que isso? Bem, nós temos o construtor de Winston e a função draw 65 00:04:01,613 --> 00:04:02,917 e tiramos a função talk. 66 00:04:02,917 --> 00:04:06,444 Pode-se notar que esquecemos de dizer na verdade que o protótipo de Winston 67 00:04:06,444 --> 00:04:10,349 deve se basear no protótipo de criatura. Precisamos daquela linha muito importante. 68 00:04:10,349 --> 00:04:15,561 Winston.prototype = Object.create(Creature.prototype) 69 00:04:19,000 --> 00:04:20,426 E repare num ponto importante. 70 00:04:20,426 --> 00:04:24,977 Eu tenho essa linha depois da função do construtor mas antes de adicionar qualquer 71 00:04:24,977 --> 00:04:28,614 outra coisa ao protótipo do Winston. Isso é o que você geralmente quer fazer. 72 00:04:28,614 --> 00:04:31,230 Você quer dizer que assim que você estiver começando, 73 00:04:31,230 --> 00:04:34,050 é nisso que seu protótipo inicial vai ser baseado. 74 00:04:34,050 --> 00:04:37,124 Mas então podemos continuar adicionando coisas ao seu protótipo. 75 00:04:37,124 --> 00:04:41,473 Porque pode haver algo que é único aos Winstons ou único aos Hoppers 76 00:04:41,473 --> 00:04:43,009 que outras criatura não tem. 77 00:04:43,009 --> 00:04:45,765 E isso não tem problema, você pode definir essas coisas. 78 00:04:46,485 --> 00:04:49,976 Agora, se olharmos, ainda temos algumas partes de código repetidas. 79 00:04:49,976 --> 00:04:51,524 O código do construtor. 80 00:04:51,524 --> 00:04:53,366 Temos ele todas as três vezes. 81 00:04:53,366 --> 00:04:56,638 Então poderíamos apenas deletá-lo? 82 00:04:57,918 --> 00:04:59,410 Vamos tentar. 83 00:05:00,870 --> 00:05:03,439 Não parece que isso funcionou. 84 00:05:03,439 --> 00:05:07,500 Porque nosso Hopper aparecer lá em cima no canto esquerdo e esqueceu tudo sobre si. 85 00:05:07,500 --> 00:05:12,994 E isso é porque JavaScritpt não assume que você quer o mesmo construtor mesmo que 86 00:05:12,994 --> 00:05:15,859 você queira basear o protótipo nele. 87 00:05:16,019 --> 00:05:19,491 Você sabe, você pode definir seu próprio construtor para esses objetos. 88 00:05:19,491 --> 00:05:26,043 Mas você também tem um jeito fácil de chamar um construtor dentro de um objeto. 89 00:05:26,043 --> 00:05:28,306 Então o jeito que podemos fazer isso é escrevendo 90 00:05:28,306 --> 00:05:35,470 Creature.call(this, nickname, age, x, y) 91 00:05:36,400 --> 00:05:39,528 O que isso faz, note que funcionou. 92 00:05:39,528 --> 00:05:44,619 E o que isso fez foi realmente chamar a função da criatura, a função construtora. 93 00:05:44,619 --> 00:05:48,339 Está chamando essa função mas está chamando e dizendo você deveria chamar 94 00:05:48,339 --> 00:05:53,694 a função construtora como se ela estivesse sendo chamada de um objeto Hopper. 95 00:05:53,694 --> 00:05:56,928 E como se ela estivesse sendo chamada com esses argumentos. 96 00:05:56,928 --> 00:05:59,427 E esses são os argumentos com que Hopper foi chamado. 97 00:05:59,827 --> 00:06:03,679 E, no fim, o código vai ser executado como se estivesse logo aqui. 98 00:06:03,679 --> 00:06:06,577 E isso é exatamente o que queremos. E funcionou! 99 00:06:06,577 --> 00:06:13,919 E podemos ir a frente e copiar essa linha dentro do construtor do Winston também. 100 00:06:15,069 --> 00:06:16,531 E funciona! 101 00:06:17,371 --> 00:06:20,561 Então olhe aqui, encapsulamos todas as propriedades compartilhadas e 102 00:06:20,561 --> 00:06:24,567 funcionalidades dos nossos objetos em um único tipo de objeto base, criatura. 103 00:06:24,567 --> 00:06:27,951 E fizemos dois tipos de objeto que se estendem deste objeto base. 104 00:06:27,951 --> 00:06:31,518 Eles herdam funcionalidades mas também adicionam suas próprias. 105 00:06:31,718 --> 00:06:33,395 E o mais legal sobre isso é que 106 00:06:33,395 --> 00:06:36,442 podemos alterar a funcionalidade compartilhada em um único lugar. 107 00:06:36,442 --> 00:06:38,821 Por exemplo, se quiséssemos mudar a idade de novo, 108 00:06:38,821 --> 00:06:41,110 poderíamos dizer: mais "anos de idade". 109 00:06:41,510 --> 00:06:43,991 Agora todo mundo tem "anos de idade". 110 00:06:44,101 --> 00:06:52,472 Ou poderíamos mudar a função talk. E agora Winstons e Hoppers estão dizendo "sup". 111 00:06:52,602 --> 00:06:56,424 Então agora que você viu como criar tipos de objeto e herdar de tipos de objetos, 112 00:06:56,424 --> 00:06:58,168 você pode começar a pensar como isso 113 00:06:58,168 --> 00:07:01,267 pode ser útil em nossos desenhos e animações e simulações e jogos. 114 00:07:01,267 --> 00:07:04,973 Por exemplo, talvez você tenha um jogo e tenha vários tipos de personagens nele 115 00:07:04,973 --> 00:07:07,660 e todos eles podem correr mas somente alguns podem pular. 116 00:07:07,660 --> 00:07:11,660 É um lugar perfeito pra alguns tipos de objeto e algumas heranças. 117 00:07:11,844 --> 00:07:15,360 Mas eu aposto que você pode pensar em uma tonelada de outros jeitos também. 118 00:07:15,360 --> 00:07:17,000 Legendado por [Alberto Oliveira] Revisado por [Fernando dos Reis]