0:00:01.006,0:00:03.482 Wracamy do programu[br]tworzącego Winstonów. 0:00:03.582,0:00:06.335 Dodałam nowy typ obiektu: Hopper, 0:00:06.435,0:00:08.637 bo Hopper czuła się pominięta. 0:00:08.737,0:00:11.977 Definiuję ją tak samo jak Winstona. 0:00:12.077,0:00:14.210 Zaczynam od konstruktora, 0:00:14.310,0:00:16.927 potem są właściwości,[br]rysowanie i mówienie... 0:00:17.027,0:00:20.828 Dodałam też metodę „Hura!”, 0:00:20.928,0:00:25.216 bo Hopper bardzo lubi świętować.[br]A Winston - wcale. 0:00:25.316,0:00:29.785 U dołu funkcji stworzyłam[br]dwa nowe obiekty „Hopper”: 0:00:29.885,0:00:32.972 Dużą i Małą. Narysowałam je. 0:00:33.072,0:00:36.540 Jednej przypisałam funkcję[br]mówienia, drugiej - „Hura”. 0:00:36.640,0:00:40.081 I dobrze. Patrząc[br]w ten fragment programu, 0:00:40.181,0:00:42.504 możecie zauważyć coś ciekawego. 0:00:42.604,0:00:47.162 Program dla Hopper[br]jest podobny do tego dla Winstona. 0:00:47.262,0:00:49.133 Zwróćcie uwagę na konstruktora. 0:00:49.233,0:00:54.822 Może pamiętacie... To dokładnie[br]ten sam program, co u Winstona. 0:00:54.922,0:01:00.186 I funkcja „talk” jest identyczna[br]jak u niego. 0:01:01.045,0:01:04.311 Jedno i drugie ma funkcję „draw”. 0:01:04.411,0:01:07.175 Te dwa typy obiektów wiele łączy! 0:01:07.275,0:01:12.817 To ma sens, bo Hopper i Winston[br]są podobnymi typami w naszym świecie. 0:01:12.917,0:01:17.067 Zresztą w prawdziwym świecie,[br]poza komputerem, 0:01:17.879,0:01:20.717 wiele typów obiektów[br]przypomina inne. 0:01:20.817,0:01:22.732 Np. w królestwie zwierząt. 0:01:22.832,0:01:25.310 Wszystkie zwierzęta[br]są do siebie podobne. 0:01:25.410,0:01:29.065 Ale są różne typy zwierząt,[br]np. ludzie. 0:01:29.165,0:01:34.365 Ludzie są podobni do zwierząt,[br]a także do siebie nawzajem. 0:01:34.465,0:01:37.918 Możemy więc powiedzieć,[br]że „zwierzę” to typ obiektu, 0:01:38.018,0:01:41.680 od którego typ obiektu „człowiek”[br]dziedziczy funkcjonalność. 0:01:41.780,0:01:43.560 Nie zaczynamy się z niczego; 0:01:43.660,0:01:46.718 dodajemy cechy do tych,[br]które mamy jako zwierzęta. 0:01:46.818,0:01:48.922 Wszystkie zwierzęta wydają odgłosy, 0:01:49.022,0:01:50.944 a ludzie dodatkowo mówią. 0:01:51.823,0:01:56.331 Pojęcie dziedziczenia obiektów[br]przydaje się też w programowaniu. 0:01:56.431,0:02:00.650 W JavaScript możemy stworzyć[br]łańcuch dziedziczenia obiektów. 0:02:00.750,0:02:04.830 Zastanówmy się, co łączy[br]nasze typy obiektów. 0:02:04.930,0:02:06.641 I wymyślmy nazwę. 0:02:06.741,0:02:10.542 Stworzymy nowy typ obiektu,[br]reprezentujący obiekt bazowy. 0:02:10.642,0:02:13.561 Dajmy nazwę: „Creatures”[br](istoty). Bo nimi są. 0:02:13.661,0:02:16.092 Piszemy: „var creature =”... 0:02:16.192,0:02:17.980 Potrzebujemy konstruktora. 0:02:18.080,0:02:22.802 Ma go Hopper.[br]Taki sam jest u Winstona. 0:02:22.902,0:02:25.171 W porządku? I teraz... 0:02:25.271,0:02:28.445 Zobaczmy... Teraz chcemy... 0:02:28.545,0:02:33.251 Co dalej? Może dodamy[br]funkcję „talk”? 0:02:33.351,0:02:35.829 Zabierzemy ją. 0:02:35.929,0:02:39.822 Musi być w prototypie „creature”. 0:02:39.922,0:02:41.216 W porządku. 0:02:41.316,0:02:45.209 Mamy już typ obiektu „creature”. 0:02:45.309,0:02:48.205 Ale Hopper musi się dowiedzieć, 0:02:48.305,0:02:52.524 że ma na opierać swoje działanie[br]na „creature”. 0:02:52.624,0:02:55.589 Załatwimy to, pisząc ten wiersz. 0:02:55.689,0:02:58.863 Piszemy: „Hopper.prototype” 0:02:58.963,0:03:02.485 równa się „object.create” 0:03:02.585,0:03:04.839 „creature.prototype”. 0:03:04.939,0:03:07.996 Ten wiersz każe językowi JavaScript 0:03:08.096,0:03:12.121 oprzeć prototyp,[br]czyli funkcjonalność Hopper, 0:03:12.221,0:03:14.908 na prototypie „creature”. 0:03:15.008,0:03:19.970 Zawsze, gdy program szuka[br]funkcji u Hopper, 0:03:20.070,0:03:22.965 najpierw spojrzy na prototyp. 0:03:23.065,0:03:26.657 A jeśli tam nie znajdzie,[br]to spojrzy na prototyp „creature”. 0:03:26.757,0:03:28.956 To nazywamy łańcuchem prototypów. 0:03:29.652,0:03:31.464 Po zrobieniu tego 0:03:31.564,0:03:35.156 powinno być możliwe skasowanie[br]funkcji „talk” u Hopper. 0:03:35.256,0:03:37.454 Bo jest już w „creature”. 0:03:37.554,0:03:39.793 Wyżej w łańcuchu prototypów.[br]Spróbujmy! 0:03:39.893,0:03:42.841 Gotowi? Udało się! 0:03:42.941,0:03:47.648 Bo program znalazł funkcję[br]w prototypie „creature”. 0:03:48.762,0:03:51.479 Spróbujmy skasować[br]tę funkcję u Winstona. 0:03:53.221,0:03:57.958 Nie udało się. Obiekt nie ma[br]metody „talk”. 0:03:58.058,0:03:59.513 A dlaczego? 0:03:59.613,0:04:02.787 Są konstruktor i „draw”,[br]a „talk” usunęliśmy. 0:04:02.887,0:04:06.583 Zapomnieliśmy powiedzieć[br]prototypowi Winstona, 0:04:06.683,0:04:10.109 że ma się opierać na prototypie[br]„creature”. Ważny wiersz: 0:04:10.209,0:04:15.489 „Winston.prototype=object.create[br]creature.portotype”. 0:04:17.995,0:04:21.038 Już! Zauważcie coś istotnego: 0:04:21.137,0:04:23.682 Ten wiersz jest po konstruktorze, 0:04:23.782,0:04:27.135 ale wpisuję go, zanim dodam coś[br]do prototypu Winstona. 0:04:27.235,0:04:29.792 Zazwyczaj chcemy powiedzieć, 0:04:29.892,0:04:34.181 że na tym będzie się opierać[br]początkowy prototyp. 0:04:34.281,0:04:37.106 Możemy dodawać do prototypu[br]kolejne elementy. 0:04:37.206,0:04:40.775 Winston i Hopper mogą mieć[br]charakterystyczne cechy, 0:04:40.875,0:04:45.210 których nie ma w „creatures”.[br]Super, że można je zdefiniować! 0:04:46.557,0:04:49.901 No dobrze. Widzimy[br]powtarzające się fragmenty. 0:04:50.001,0:04:51.334 To konstruktor. 0:04:51.434,0:04:53.918 Ten sam we wszystkich[br]trzech przypadkach. 0:04:54.018,0:04:56.843 Czy możemy go skasować? 0:04:58.028,0:04:59.189 Spróbujmy. 0:05:01.000,0:05:03.577 Hmmm... Nie udało się. 0:05:03.677,0:05:07.726 Hopper pokazuje się w lewym górnym[br]rogu. Nie pamięta nic o sobie. 0:05:07.826,0:05:10.868 Bo JavaScript nie zakłada, 0:05:10.968,0:05:15.118 że chcemy tego samego konstruktora,[br]nawet gdy ma być w prototypie. 0:05:15.218,0:05:19.181 Pozwala nam zdefiniować[br]konstruktora dla tych obiektów. 0:05:19.281,0:05:22.548 I daje łatwy sposób,[br]by przywołać 0:05:22.648,0:05:26.031 tę funkcję z obiektu. 0:05:26.131,0:05:29.003 Piszemy więc: „creature”... 0:05:29.103,0:05:30.187 kropka, „call”, 0:05:30.954,0:05:35.342 „this,nickname,age,x,y”. 0:05:35.738,0:05:36.503 Dobrze. 0:05:36.603,0:05:39.289 Program robi to[br](zauważcie - zadziałało!)... 0:05:39.389,0:05:44.607 przywołuje funkcję[br]„creature”, konstruktora. 0:05:44.707,0:05:47.958 Przywołuje funkcję, ale mówi: 0:05:48.058,0:05:53.268 „przywołaj tę funkcję tak[br]jak z obiektu Hopper, 0:05:54.065,0:05:56.745 jak z tymi argumentami”. 0:05:56.845,0:05:59.607 Tak została przywołana Hopper. 0:05:59.707,0:06:03.810 Program zostanie wykonany tak,[br]jakby był tutaj. 0:06:03.910,0:06:05.480 I o to właśnie nam chodzi. 0:06:05.582,0:06:06.712 Udało się! 0:06:06.812,0:06:09.917 Możemy skopiować ten wiersz 0:06:10.017,0:06:13.678 także do konstruktora Winstona. 0:06:14.862,0:06:16.883 To działa. Tak! 0:06:16.983,0:06:19.019 Dobrze. Patrzcie: 0:06:19.119,0:06:21.991 zamknęliśmy wspólne właściwości[br]i funkcjonalność 0:06:22.091,0:06:24.661 w jednym typie obiektu bazowego,[br]„creature”, 0:06:24.761,0:06:28.144 i na tej podstawie stworzyliśmy[br]dwa typy obiektów. 0:06:28.244,0:06:31.737 Dziedziczą funkcjonalność,[br]ale dodają też własną. 0:06:31.837,0:06:36.271 Wystarczy zmienić tę funkcjonalność[br]w jednym miejscu. 0:06:36.371,0:06:40.869 Np. moglibyśmy zmienić wiek,[br]pisząc: „plus lata”. 0:06:40.969,0:06:43.934 Teraz każdy ma na końcu „lata”. 0:06:44.034,0:06:48.206 Możemy też zmienić[br]funkcje „talk”. „Super!”. 0:06:48.306,0:06:52.107 Teraz każdy Winston[br]i Hopper mówią: „Super!”. 0:06:52.897,0:06:56.589 Wiecie, jak tworzyć typy obiektów[br]i jak przebiega dziedziczenie. 0:06:56.689,0:07:00.099 Pomyślcie, jak to wykorzystać[br]w rysowaniu, animacjach, 0:07:00.199,0:07:01.422 symulacjach i grach. 0:07:01.522,0:07:04.560 Np. macie grę[br]z wieloma postaciami... 0:07:04.660,0:07:07.542 Wszystkie biegają,[br]ale tylko niektóre skaczą. 0:07:07.642,0:07:11.589 Tu trzeba wykorzystać typy[br]obiektów i dziedziczenie! 0:07:11.689,0:07:15.304 Na pewno wymyślicie też[br]mnóstwo własnych zastosowań.