0:00:00.977,0:00:03.623 Jsme zpět u našeho programu,[br]který vytváří Winstony. 0:00:03.623,0:00:06.339 Ale přidala jsem nový [br]typ objektu a to Hoppera. 0:00:06.339,0:00:08.739 Protože Hopper se cítil[br]trochu opomenutý. 0:00:08.739,0:00:11.924 Teď definuji Hoppera stejným [br]způsobem, jakým definuji Winstona. 0:00:11.924,0:00:15.394 Počínaje funkcí konstruktoru[br]a stejnými vlastnostmi. 0:00:15.394,0:00:16.963 Máme zde draw a talk... 0:00:16.963,0:00:20.933 A pak jsem také přidala [br]další metodu zvanou Horray. 0:00:20.933,0:00:25.328 Protože Hoppeři opravdu rádi[br]slaví a Winstoni zase ne. 0:00:25.328,0:00:29.924 Ve spodní části funkce jsem [br]vytvořila dva nové objekty Hoppera: 0:00:29.924,0:00:31.524 Little Hoppera a Big Hoppera. 0:00:31.524,0:00:36.507 Nakreslila jsem je a na jednoho[br]zavolala "talk" a na druhého "hooray". 0:00:36.507,0:00:37.676 Je to celkem povedené. 0:00:37.676,0:00:42.648 Když se ale podíváte na horní část kódu,[br]možná si všimnete něčeho zajímavého. 0:00:42.648,0:00:47.314 Kód pro Hoppera je velmi podobný[br]kódu pro Winstona. 0:00:47.314,0:00:49.464 Obzvláště se podívejte [br]na tento konstruktor. 0:00:49.464,0:00:50.844 Nevím, jestli si vzpomínáte, 0:00:50.844,0:00:54.864 ale tento kód vypadá úplně stejně[br]jako kód pro konstruktor Winstona. 0:00:54.864,0:00:58.493 Tato funkce talk je taky[br]definována úplně stejným kódem, 0:00:58.493,0:01:00.507 jako funkce talk u Winstona. 0:01:02.002,0:01:03.897 Oba mají také funkci draw. 0:01:03.897,0:01:07.382 Tyto dva typy objektů mají[br]tedy hodně společného. 0:01:07.382,0:01:08.841 A dává to smysl, 0:01:08.841,0:01:13.299 protože Hopper a Winston jsou v našem[br]světě dva velmi podobné typy objektů. 0:01:13.299,0:01:17.879 A pokud uvažujete o skutečném světě,[br]o tom mimo počítač, 0:01:17.879,0:01:20.809 většina typů objektů sdílí podobné rysy[br]s jinými typy objektů. 0:01:20.809,0:01:22.453 Například zvířecí říše. 0:01:22.453,0:01:25.543 Všechna zvířata jsou [br]v některých ohledech podobná. 0:01:25.543,0:01:29.762 A pak máme různé typy[br]zvířat, jako například lidi. 0:01:29.762,0:01:34.298 Lidé hodně podobností sdílejí, ale také[br]mají své vlastní jedinečné podobnosti. 0:01:34.298,0:01:38.100 Takže bychom mohli říct, [br]že zvíře je typ objektu, 0:01:38.100,0:01:41.627 od kterého typ lidského objektu[br]zdědil určitou funkčnost. 0:01:41.627,0:01:43.634 Nezačíname úplně od nuly. 0:01:43.634,0:01:46.894 Přidáváme k funkcionalitě,[br]kterou máme jako zvíře. 0:01:46.894,0:01:51.796 Stejně jako všechna zvířata [br]vydávají zvuky, tak lidé mají řeč. 0:01:51.796,0:01:56.363 Koncept dědičnosti objektu[br]je opravdu užitečný při programování. 0:01:56.363,0:02:00.715 Můžeme dokonce vytvořit řetězec[br]dědičnosti objektů v našem Javascriptu. 0:02:00.715,0:02:05.039 Abychom to provedli, musíme zjistit,[br]co naše typy objektů spolu sdílejí. 0:02:05.039,0:02:06.875 A musíme pro to [br]vymyslet nějaký název. 0:02:06.875,0:02:09.055 Protože se chystáme vytvořit[br]nový typ objektu, 0:02:09.055,0:02:11.089 který představuje základní objekt. 0:02:11.089,0:02:12.645 Nazvěme je creatures (tvorové). 0:02:12.645,0:02:13.984 Oba jsou totiž tvory. 0:02:13.984,0:02:16.111 Takže napíšeme: [br]var creature se rovná. 0:02:16.111,0:02:18.081 A nyní potřebujeme náš konstruktor. 0:02:18.081,0:02:19.641 Pojďme ho tedy ukrást Hopperovi, 0:02:19.641,0:02:23.412 protože je to to samé,[br]co má Winston. 0:02:26.542,0:02:29.392 Co chceme dělat dál? 0:02:29.392,0:02:32.986 Možná chceme přidat[br]funkci "talk". 0:02:32.986,0:02:36.123 Funkci talk bychom mohli[br]ukrást Hoppperovi. 0:02:36.123,0:02:39.693 Ale samozřejmě to musíme mít[br]v prototypu Creature. 0:02:41.213,0:02:45.540 Takže teď máme tento [br]typ objektu Creature. 0:02:45.540,0:02:48.000 Ale ještě musíme Hopperovi říct, 0:02:48.000,0:02:52.391 že Hopper by vlastně měl zakládat [br]svou funkčnost na základě Creature. 0:02:52.391,0:02:55.901 Můžeme to udělat napsáním[br]tohoto řádku zde. 0:02:55.901,0:03:04.750 Napíšeme: Hopper.prototype rovná [br]se object.create(creature.prototype); 0:03:04.750,0:03:09.567 Tento řádek říká, aby Javascript [br]založil Hopperův prototyp, 0:03:09.567,0:03:15.357 čili všechny jeho funkce,[br]na základě prototypu Creature. 0:03:15.357,0:03:19.857 To znamená, že pokaždé, [br]když hledá funkci pro Hoppera, 0:03:19.857,0:03:23.777 podívá se nejprve na Hopperův [br]prototyp a pokud ho nenajde, 0:03:23.777,0:03:26.619 podívá se, zda je součástí[br]prototypu Creature. 0:03:26.619,0:03:29.496 A to je to, čemu říkáme[br]prototypový řetězec. 0:03:29.496,0:03:31.442 Jakmile máme toto hotovo, 0:03:31.442,0:03:35.592 měli bychom být schopni smazat [br]funkci talk pro Hoppera, 0:03:35.592,0:03:37.602 protože ta již existuje[br]v rámci Creatura. 0:03:37.602,0:03:40.300 Je už v prototypovém řetězci, [br]tak to zkusíme. 0:03:42.202,0:03:47.701 Funguje to a to kvůli tomu,[br]že talk najdeme u prototypu Creature. 0:03:48.574,0:03:52.634 Zkusme to smazat [br]také u Winstona. 0:03:53.574,0:03:55.620 Nefungovalo to. 0:03:55.620,0:03:58.170 Máme hlášení, že objekt [br]nemá žádnou metodu talk. 0:03:58.170,0:03:59.430 Ale proč to tak je? 0:03:59.430,0:04:02.993 Máme náš konstruktor Winstona i[br]funkci draw a jenom jsme odebrali talk. 0:04:02.993,0:04:06.297 Všimnete si, že jsme zapomněli[br]říci prototopu Winstona, 0:04:06.297,0:04:08.601 že má být založen na základě [br]prototypu Creature. 0:04:08.601,0:04:10.741 Potřebujeme tedy přidat [br]velmi důležitý řádek: 0:04:10.741,0:04:15.961 Winston.prototype rovná se[br]Object.create(Creature.prototype); 0:04:19.156,0:04:20.636 Všimněte si něčeho důležitého. 0:04:20.636,0:04:23.526 Tento řádek máme až po[br]funkci konstruktoru, 0:04:23.526,0:04:27.038 ale předtím, než k prototypu Winstona[br]přidáme cokoli jiného. 0:04:27.038,0:04:29.053 Obvykle to chcete udělat tak, 0:04:29.053,0:04:33.950 že si nejdříve určíte,[br]jaký prototyp bude výchozí. 0:04:33.950,0:04:36.974 Poté k prototypu[br]přidáváte další věci. 0:04:36.974,0:04:38.923 Protože by mohly [br]existovat nějaké věci, 0:04:38.923,0:04:41.851 které jsou jedinečné pro Winstony [br]nebo jedinečné pro Hoppery. 0:04:41.851,0:04:43.159 Nejsou závislé na Creature. 0:04:43.159,0:04:46.609 A to je naprosto v pohodě,[br]můžete je definovat. 0:04:46.609,0:04:50.205 Teď, když se na to podíváme,[br]pořád se nám opakuje nějaký kód. 0:04:50.205,0:04:51.274 Kód konstruktoru. 0:04:51.274,0:04:54.630 Máme ho celkem třikrát. 0:04:54.630,0:05:00.618 Co kdybychom ho smazali,[br]pojďme to zkusit. 0:05:00.618,0:05:03.248 Dobře, vypadá to,[br]že to takhle nepůjde. 0:05:03.248,0:05:05.369 Náš Hopper se objevil[br]v levém horním rohu. 0:05:05.369,0:05:08.415 A všechno o sobě zapomněl. 0:05:08.415,0:05:10.944 To se stalo kvůli tomu, [br]že Javascript nepředpokládá, 0:05:10.944,0:05:15.014 že chcete stejný konstruktor,[br]i když na něm chcete založit prototyp. 0:05:16.004,0:05:19.109 To vám umožní definovat svůj vlastní[br]konstruktor pro tyto objekty. 0:05:19.109,0:05:26.168 Ale také vám to ulehčuje[br]volání konstruktoru z podobjektu. 0:05:26.168,0:05:28.426 Způsob, jakým to můžeme udělat,[br]je, že napíšeme: 0:05:28.426,0:05:35.860 Creature.call(this, nickname, age, x, y); 0:05:36.620,0:05:47.441 Dělá to to, že se zavolá funkce Creature,[br]konstrukční funkce, a řekne se: 0:05:47.441,0:05:53.599 Zavolejme si konstruktor funkce,[br]tak jako u objektu Hoppera. 0:05:53.954,0:05:56.778 A to přesně s těmi [br]samými argumenty. 0:05:56.778,0:05:59.177 To jsou argumenty,[br]které používáme u Hoppera. 0:05:59.177,0:06:03.609 A tím se provede tento kód, [br]jako by to bylo právě tady. 0:06:03.609,0:06:05.557 A přesně to chceme. 0:06:05.557,0:06:06.557 A fungovalo to. 0:06:06.557,0:06:13.809 Můžeme pokračovat a zkopírovat[br]tento řádek i do konstruktoru Winstona. 0:06:14.665,0:06:16.721 A funguje to. 0:06:17.824,0:06:18.811 Podívejte na to. 0:06:18.811,0:06:21.971 Shrnuli jsme všechny naše sdílené[br]vlastnosti a funkce o objektech, 0:06:21.971,0:06:24.651 do tohoto jediného a základního [br]typu objektu: Creature. 0:06:24.651,0:06:28.657 A vytvořili jsme dva typy objektů, které[br]jsou rozšířením tohoto základního objektu. 0:06:28.657,0:06:31.681 Zdědí nějakou funkčnost,[br]ale také přidávají své vlastní. 0:06:31.681,0:06:33.059 A opravdu skvělé je to, 0:06:33.059,0:06:36.239 že můžeme změnit sdílenou[br]funkčnost na jednom místě. 0:06:36.239,0:06:40.769 Kdybychom chtěli změnit věk,[br]stačilo by napsat: "+ years old". 0:06:40.769,0:06:43.938 Super, teď všichni mají[br]"years old" na konci. 0:06:43.938,0:06:46.331 Nebo bychom mohli [br]změnit funkci "talk". 0:06:49.231,0:06:53.071 A nyní Winstoni i Hoppeři[br]říkají "sup". 0:06:53.071,0:06:54.381 Takže teď jste viděli, 0:06:54.381,0:06:56.768 jak vytvářet typy objektů[br]a jak typu objektu dědit. 0:06:56.768,0:06:58.163 Můžete začít přemýšlet o tom, 0:06:58.163,0:07:02.044 jak by to mohlo být užitečné ve vašich [br]kresbách, animacích, simulacích a hrách. 0:07:02.044,0:07:05.054 Můžete mít třeba hru, která[br]obsahuje mnoho typů postav. 0:07:05.054,0:07:07.833 Všechny mohou běžet,[br]ale jen některé mohou skákat. 0:07:07.833,0:07:11.870 To je perfektní místo pro použití[br]typů objektů a jejich dědičnosti. 0:07:11.870,0:07:15.790 Vsadím se, že dokáže přijít[br]na hodně dalších příkladů.