jesteś tutaj
623
Stosowanie prototypów
Kolejne porządki
W naszym skrypcie jest jeszcze jedno miejsce, które moglibyśmy nieco uporządkować:
to kod konstruktora
ShowDog
. Przyjrzyjmy mu się jeszcze raz.
Jeśli jeszcze tego nie zauważyłeś,
informujemy, że ten fragment jest
kopią kodu z konstruktora Dog.
function ShowDog(name, breed, weight, handler) {
this.name = name;
this.breed = breed;
this.weight = weight;
this.handler = handler;
}
Czytając tę książkę, już nie raz przekonałeś się, że za każdym razem, gdy
napotykamy powtarzający się kod, rozbrzmiewają dzwonki alarmowe. W tym
przypadku konstruktor
Dog
doskonale wie, jak ma wykonywać swoją pracę,
dlaczego zatem z niego nie skorzystać? Co więcej, choć nasz przykład jest
całkiem prosty, może się zdarzyć, że kod używany przez konstruktory do
wyliczania początkowych wartości właściwości będzie bardzo złożony, a my nie
chcemy przecież powielać go za każdym razem, gdy będziemy tworzyć nowy
konstruktor dziedziczący po innym prototypie. Jak rozwiązać ten problem?
Najpierw napiszemy kod, a później go przeanalizujemy.
Jak widzisz, zastąpiliśmy powtarzający się kod konstruktora
ShowDog
wywołaniem
metody o nazwie
Dog.call
. A tak ona działa:
call
to wbudowana metoda,
którą można wywoływać na rzecz dowolnej funkcji (a pamiętaj, że konstruktor
Dog
jest funkcją). Metoda
Dog.call
wywołuje funkcję
Dog
i przekazuje do niej
obiekt, który ma się stać wartością zmiennej
this
, jak również wszelkie pozostałe
argumenty, których oczekuje funkcja
Dog
. Rozłóżmy to na czynniki pierwsze.
function ShowDog(name, breed, weight, handler) {
Dog.call(this, name, breed, weight);
this.handler = handler;
}
Ta sugestia, by zawsze dążyć
do eliminacji powtarzającego
się kodu, ma nawet swoją
nazwę: DRY — „Don’t Repeat
Yourself” (nie powtarzaj się);
znają ją i używają jej wszyscy
programiści.
Ten wiersz kodu korzysta
z konstruktora Dog, by odpowiednio
obsłużyć parametry name, breed
oraz weight.
Wciąż jednak sami musimy zająć się
obsługą parametru handler, gdyż kod
konstruktora Dog nie wie, co z nim zrobić.
Dog.call(this, name, breed, weight);
Dog jest funkcją,
którą mamy
zamiar wywołać.
Jakakolwiek będzie wartość
this, zostanie ona użyta
jako wartość this w ciele
funkcji Dog.
Pozostałe argumenty
są przekazywane
do funkcji Dog w
zwyczajny sposób.
W ten sposób wywołujemy
funkcję konstruktora Dog,
lecz każemy jej użyć
instancji ShowDog jako
this, bo wtedy konstruktor
Dog określi wartości
właściwości name, breed
oraz weight naszego
obiektu ShowDog.
call jest metodą funkcji Dog, którą chcemy wywołać.
Metoda call spowoduje, że funkcja Dog zostanie
wywołana. Skorzystaliśmy z metody call, zamiast
bezpośrednio wywołać funkcję Dog, aby można było
określić wartość this w ciele tej funkcji.
Get Programowanie w JavaScript Rusz głową! now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.