Już wiemy, jak stworzyć typ obiektu
i dwa obiekty winstonokształtne,
a potem uruchomić je konstruktorami.
Typ obiektu nie musi być
kojarzony z właściwościami.
Może mieć też funkcjonalność.
Pomyślcie o świecie
i typach obiektów w nim.
Weźmy np. ludzi.
Wszyscy mamy wzrost i wiek,
wykonujemy też czynności:
śpimy, jemy, programujemy.
Chcemy skojarzyć te funkcje
z typami obiektów.
Poprzedni odcinek skończyliśmy tak:
mamy funkcję „drawWinston”,
którą przywołujemy
przy obu obiektach „Winston”.
Czy nie byłoby świetnie
przyłączyć ją
do typu obiektu „Winston”?
Można to zrobić z łatwością.
Pod konstruktorem napiszemy:
„Winston”...
(wielkie „w”), „. prototype”.
Słowa „prototype” jeszcze
w programowaniu nie widzieliście.
To właściwość obiektu,
do której możemy dołączać funkcje.
A każda instancja tego obiektu
będzie powiązana z tymi funkcjami.
Piszemy „.prototype”,
potem jest kropka,
a po niej nazwa funkcji, np. „draw”.
Dalej znak równości i możemy wziąć
kod „drawWinston”,
który umieścimy tutaj.
Przypisaliśmy funkcję „draw”
do prototypu Winstona.
Możemy przywoływać funkcję „draw”
do każdego obiektu
typu Winstona.
Powinno to działać przy nastoletnim
i dorosłym Winstonie.
Funkcję, którą możemy
przywołać do obiektu,
nazywamy metodą.
Będę używać tego słowa.
To jest metoda rysowania.
W porządku.
Skasujemy to i to...
Spróbujmy przywołać „draw”.
Mamy: „winstonTeen.draw”.
Wyskoczył komunikat błędu.
„WinstObject niezdefiniowany”.
No dobrze.
Wcześniej wprowadzaliśmy
ten argument do „drawWinston”,
czyli do obiektu „Winston”.
Już tego nie robimy.
Możemy to zmienić,
i co tu wprowadzimy?
Trzeba dać „winstonTeen”. OK.
Udało się, ale to głupie.
Przywołuję funkcję „draw”
do obiektu,
więc nie powinnam dodatkowo
obiektu wprowadzać!
Dwa razy to samo!
Nie powinniśmy tego robić.
Skasujmy to więc i pomyślmy.
Gdy jesteśmy wewnątrz obiektu,
jak dostać się do jego właściwości?
Spójrzmy na konstruktora.
Przypomnijmy sobie
hasło „this”. Aha!
A gdybyśmy zmienili to w to?
Zmieniamy „winstObject”
w „this”.
Jesteśmy wewnątrz obiektu.
Ta funkcja łączy się z obiektem;
„this” odnosi się
do obiektu bieżącego.
Możemy więc napisać „this”
i zyskamy dostęp do wszystkich
właściwości bieżącego obiektu.
Udało się! Świetnie, prawda?
Teraz napiszmy:
„winstonAdult.draw”.
Jest! Mamy dostęp
do właściwości „winstonAdult”,
bo ten obiekt został przywołany.
To jest rewelacyjne w haśle „this”.
Chociaż czasami trudno je wymówić.
Było wesoło, więc dodajmy
kolejną metodę.
Co jeszcze może robić Winston?
Niech mówi.
Dajmy: „Winston.prototype.talk”.
Do prototypu możemy dodać
tyle metod, ile chcemy.
Napiszmy: „Jestem Winston!”.
A potem jeszcze: „this.x+20”
i „this.y+150”.
Nic się nie wydarzyło,
bo jeszcze nie przywołałam funkcji.
Niech nastolatek mówi.
„winstonTeen.talk”.
Gada cały czas.
„Jestem Winston!”.
A teraz niech mówi dorosły.
Hura!
Mamy teraz typ obiektu „Winston”
z właściwościami: nazwą,
wiekiem, „x” i „y”.
I jest funkcjonalny.
Zachowuje się różnie
w zależności od właściwości.
Możemy stworzyć tyle
instancji Winstona, ile chcemy,
i przywołać dowolną z metod.
Nieźle, co?