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?