1 00:00:00,977 --> 00:00:03,623 Jsme zpět u našeho programu, který vytváří Winstony. 2 00:00:03,623 --> 00:00:06,339 Ale přidala jsem nový typ objektu a to Hoppera. 3 00:00:06,339 --> 00:00:08,739 Protože Hopper se cítil trochu opomenutý. 4 00:00:08,739 --> 00:00:11,924 Teď definuji Hoppera stejným způsobem, jakým definuji Winstona. 5 00:00:11,924 --> 00:00:15,394 Počínaje funkcí konstruktoru a stejnými vlastnostmi. 6 00:00:15,394 --> 00:00:16,963 Máme zde draw a talk... 7 00:00:16,963 --> 00:00:20,933 A pak jsem také přidala další metodu zvanou Horray. 8 00:00:20,933 --> 00:00:25,328 Protože Hoppeři opravdu rádi slaví a Winstoni zase ne. 9 00:00:25,328 --> 00:00:29,924 Ve spodní části funkce jsem vytvořila dva nové objekty Hoppera: 10 00:00:29,924 --> 00:00:31,524 Little Hoppera a Big Hoppera. 11 00:00:31,524 --> 00:00:36,507 Nakreslila jsem je a na jednoho zavolala "talk" a na druhého "hooray". 12 00:00:36,507 --> 00:00:37,676 Je to celkem povedené. 13 00:00:37,676 --> 00:00:42,648 Když se ale podíváte na horní část kódu, možná si všimnete něčeho zajímavého. 14 00:00:42,648 --> 00:00:47,314 Kód pro Hoppera je velmi podobný kódu pro Winstona. 15 00:00:47,314 --> 00:00:49,464 Obzvláště se podívejte na tento konstruktor. 16 00:00:49,464 --> 00:00:50,844 Nevím, jestli si vzpomínáte, 17 00:00:50,844 --> 00:00:54,864 ale tento kód vypadá úplně stejně jako kód pro konstruktor Winstona. 18 00:00:54,864 --> 00:00:58,493 Tato funkce talk je taky definována úplně stejným kódem, 19 00:00:58,493 --> 00:01:00,507 jako funkce talk u Winstona. 20 00:01:02,002 --> 00:01:03,897 Oba mají také funkci draw. 21 00:01:03,897 --> 00:01:07,382 Tyto dva typy objektů mají tedy hodně společného. 22 00:01:07,382 --> 00:01:08,841 A dává to smysl, 23 00:01:08,841 --> 00:01:13,299 protože Hopper a Winston jsou v našem světě dva velmi podobné typy objektů. 24 00:01:13,299 --> 00:01:17,879 A pokud uvažujete o skutečném světě, o tom mimo počítač, 25 00:01:17,879 --> 00:01:20,809 většina typů objektů sdílí podobné rysy s jinými typy objektů. 26 00:01:20,809 --> 00:01:22,453 Například zvířecí říše. 27 00:01:22,453 --> 00:01:25,543 Všechna zvířata jsou v některých ohledech podobná. 28 00:01:25,543 --> 00:01:29,762 A pak máme různé typy zvířat, jako například lidi. 29 00:01:29,762 --> 00:01:34,298 Lidé hodně podobností sdílejí, ale také mají své vlastní jedinečné podobnosti. 30 00:01:34,298 --> 00:01:38,100 Takže bychom mohli říct, že zvíře je typ objektu, 31 00:01:38,100 --> 00:01:41,627 od kterého typ lidského objektu zdědil určitou funkčnost. 32 00:01:41,627 --> 00:01:43,634 Nezačíname úplně od nuly. 33 00:01:43,634 --> 00:01:46,894 Přidáváme k funkcionalitě, kterou máme jako zvíře. 34 00:01:46,894 --> 00:01:51,796 Stejně jako všechna zvířata vydávají zvuky, tak lidé mají řeč. 35 00:01:51,796 --> 00:01:56,363 Koncept dědičnosti objektu je opravdu užitečný při programování. 36 00:01:56,363 --> 00:02:00,715 Můžeme dokonce vytvořit řetězec dědičnosti objektů v našem Javascriptu. 37 00:02:00,715 --> 00:02:05,039 Abychom to provedli, musíme zjistit, co naše typy objektů spolu sdílejí. 38 00:02:05,039 --> 00:02:06,875 A musíme pro to vymyslet nějaký název. 39 00:02:06,875 --> 00:02:09,055 Protože se chystáme vytvořit nový typ objektu, 40 00:02:09,055 --> 00:02:11,089 který představuje základní objekt. 41 00:02:11,089 --> 00:02:12,645 Nazvěme je creatures (tvorové). 42 00:02:12,645 --> 00:02:13,984 Oba jsou totiž tvory. 43 00:02:13,984 --> 00:02:16,111 Takže napíšeme: var creature se rovná. 44 00:02:16,111 --> 00:02:18,081 A nyní potřebujeme náš konstruktor. 45 00:02:18,081 --> 00:02:19,641 Pojďme ho tedy ukrást Hopperovi, 46 00:02:19,641 --> 00:02:23,412 protože je to to samé, co má Winston. 47 00:02:26,542 --> 00:02:29,392 Co chceme dělat dál? 48 00:02:29,392 --> 00:02:32,986 Možná chceme přidat funkci "talk". 49 00:02:32,986 --> 00:02:36,123 Funkci talk bychom mohli ukrást Hoppperovi. 50 00:02:36,123 --> 00:02:39,693 Ale samozřejmě to musíme mít v prototypu Creature. 51 00:02:41,213 --> 00:02:45,540 Takže teď máme tento typ objektu Creature. 52 00:02:45,540 --> 00:02:48,000 Ale ještě musíme Hopperovi říct, 53 00:02:48,000 --> 00:02:52,391 že Hopper by vlastně měl zakládat svou funkčnost na základě Creature. 54 00:02:52,391 --> 00:02:55,901 Můžeme to udělat napsáním tohoto řádku zde. 55 00:02:55,901 --> 00:03:04,750 Napíšeme: Hopper.prototype rovná se object.create(creature.prototype); 56 00:03:04,750 --> 00:03:09,567 Tento řádek říká, aby Javascript založil Hopperův prototyp, 57 00:03:09,567 --> 00:03:15,357 čili všechny jeho funkce, na základě prototypu Creature. 58 00:03:15,357 --> 00:03:19,857 To znamená, že pokaždé, když hledá funkci pro Hoppera, 59 00:03:19,857 --> 00:03:23,777 podívá se nejprve na Hopperův prototyp a pokud ho nenajde, 60 00:03:23,777 --> 00:03:26,619 podívá se, zda je součástí prototypu Creature. 61 00:03:26,619 --> 00:03:29,496 A to je to, čemu říkáme prototypový řetězec. 62 00:03:29,496 --> 00:03:31,442 Jakmile máme toto hotovo, 63 00:03:31,442 --> 00:03:35,592 měli bychom být schopni smazat funkci talk pro Hoppera, 64 00:03:35,592 --> 00:03:37,602 protože ta již existuje v rámci Creatura. 65 00:03:37,602 --> 00:03:40,300 Je už v prototypovém řetězci, tak to zkusíme. 66 00:03:42,202 --> 00:03:47,701 Funguje to a to kvůli tomu, že talk najdeme u prototypu Creature. 67 00:03:48,574 --> 00:03:52,634 Zkusme to smazat také u Winstona. 68 00:03:53,574 --> 00:03:55,620 Nefungovalo to. 69 00:03:55,620 --> 00:03:58,170 Máme hlášení, že objekt nemá žádnou metodu talk. 70 00:03:58,170 --> 00:03:59,430 Ale proč to tak je? 71 00:03:59,430 --> 00:04:02,993 Máme náš konstruktor Winstona i funkci draw a jenom jsme odebrali talk. 72 00:04:02,993 --> 00:04:06,297 Všimnete si, že jsme zapomněli říci prototopu Winstona, 73 00:04:06,297 --> 00:04:08,601 že má být založen na základě prototypu Creature. 74 00:04:08,601 --> 00:04:10,741 Potřebujeme tedy přidat velmi důležitý řádek: 75 00:04:10,741 --> 00:04:15,961 Winston.prototype rovná se Object.create(Creature.prototype); 76 00:04:19,156 --> 00:04:20,636 Všimněte si něčeho důležitého. 77 00:04:20,636 --> 00:04:23,526 Tento řádek máme až po funkci konstruktoru, 78 00:04:23,526 --> 00:04:27,038 ale předtím, než k prototypu Winstona přidáme cokoli jiného. 79 00:04:27,038 --> 00:04:29,053 Obvykle to chcete udělat tak, 80 00:04:29,053 --> 00:04:33,950 že si nejdříve určíte, jaký prototyp bude výchozí. 81 00:04:33,950 --> 00:04:36,974 Poté k prototypu přidáváte další věci. 82 00:04:36,974 --> 00:04:38,923 Protože by mohly existovat nějaké věci, 83 00:04:38,923 --> 00:04:41,851 které jsou jedinečné pro Winstony nebo jedinečné pro Hoppery. 84 00:04:41,851 --> 00:04:43,159 Nejsou závislé na Creature. 85 00:04:43,159 --> 00:04:46,609 A to je naprosto v pohodě, můžete je definovat. 86 00:04:46,609 --> 00:04:50,205 Teď, když se na to podíváme, pořád se nám opakuje nějaký kód. 87 00:04:50,205 --> 00:04:51,274 Kód konstruktoru. 88 00:04:51,274 --> 00:04:54,630 Máme ho celkem třikrát. 89 00:04:54,630 --> 00:05:00,618 Co kdybychom ho smazali, pojďme to zkusit. 90 00:05:00,618 --> 00:05:03,248 Dobře, vypadá to, že to takhle nepůjde. 91 00:05:03,248 --> 00:05:05,369 Náš Hopper se objevil v levém horním rohu. 92 00:05:05,369 --> 00:05:08,415 A všechno o sobě zapomněl. 93 00:05:08,415 --> 00:05:10,944 To se stalo kvůli tomu, že Javascript nepředpokládá, 94 00:05:10,944 --> 00:05:15,014 že chcete stejný konstruktor, i když na něm chcete založit prototyp. 95 00:05:16,004 --> 00:05:19,109 To vám umožní definovat svůj vlastní konstruktor pro tyto objekty. 96 00:05:19,109 --> 00:05:26,168 Ale také vám to ulehčuje volání konstruktoru z podobjektu. 97 00:05:26,168 --> 00:05:28,426 Způsob, jakým to můžeme udělat, je, že napíšeme: 98 00:05:28,426 --> 00:05:35,860 Creature.call(this, nickname, age, x, y); 99 00:05:36,620 --> 00:05:47,441 Dělá to to, že se zavolá funkce Creature, konstrukční funkce, a řekne se: 100 00:05:47,441 --> 00:05:53,599 Zavolejme si konstruktor funkce, tak jako u objektu Hoppera. 101 00:05:53,954 --> 00:05:56,778 A to přesně s těmi samými argumenty. 102 00:05:56,778 --> 00:05:59,177 To jsou argumenty, které používáme u Hoppera. 103 00:05:59,177 --> 00:06:03,609 A tím se provede tento kód, jako by to bylo právě tady. 104 00:06:03,609 --> 00:06:05,557 A přesně to chceme. 105 00:06:05,557 --> 00:06:06,557 A fungovalo to. 106 00:06:06,557 --> 00:06:13,809 Můžeme pokračovat a zkopírovat tento řádek i do konstruktoru Winstona. 107 00:06:14,665 --> 00:06:16,721 A funguje to. 108 00:06:17,824 --> 00:06:18,811 Podívejte na to. 109 00:06:18,811 --> 00:06:21,971 Shrnuli jsme všechny naše sdílené vlastnosti a funkce o objektech, 110 00:06:21,971 --> 00:06:24,651 do tohoto jediného a základního typu objektu: Creature. 111 00:06:24,651 --> 00:06:28,657 A vytvořili jsme dva typy objektů, které jsou rozšířením tohoto základního objektu. 112 00:06:28,657 --> 00:06:31,681 Zdědí nějakou funkčnost, ale také přidávají své vlastní. 113 00:06:31,681 --> 00:06:33,059 A opravdu skvělé je to, 114 00:06:33,059 --> 00:06:36,239 že můžeme změnit sdílenou funkčnost na jednom místě. 115 00:06:36,239 --> 00:06:40,769 Kdybychom chtěli změnit věk, stačilo by napsat: "+ years old". 116 00:06:40,769 --> 00:06:43,938 Super, teď všichni mají "years old" na konci. 117 00:06:43,938 --> 00:06:46,331 Nebo bychom mohli změnit funkci "talk". 118 00:06:49,231 --> 00:06:53,071 A nyní Winstoni i Hoppeři říkají "sup". 119 00:06:53,071 --> 00:06:54,381 Takže teď jste viděli, 120 00:06:54,381 --> 00:06:56,768 jak vytvářet typy objektů a jak typu objektu dědit. 121 00:06:56,768 --> 00:06:58,163 Můžete začít přemýšlet o tom, 122 00:06:58,163 --> 00:07:02,044 jak by to mohlo být užitečné ve vašich kresbách, animacích, simulacích a hrách. 123 00:07:02,044 --> 00:07:05,054 Můžete mít třeba hru, která obsahuje mnoho typů postav. 124 00:07:05,054 --> 00:07:07,833 Všechny mohou běžet, ale jen některé mohou skákat. 125 00:07:07,833 --> 00:07:11,870 To je perfektní místo pro použití typů objektů a jejich dědičnosti. 126 00:07:11,870 --> 00:07:15,790 Vsadím se, že dokáže přijít na hodně dalších příkladů.