Dziedziczenie własności
Dziedziczenie własności
Przypuśćmy, że utworzyłeś obiekt marek jako Robotnik
, tak jak pokazano na Rysunku 8.3, za pomocą poniższej instrukcji:
marek = new Robotnik;
Gdy JavaScript napotyka na operator new, tworzy nowy ogólny obiekt i przekazuje go jako wartość słowa kluczowego this
funkcji konstruktora Robotnik. Funkcja konstruktora bezpośrednio nadaje wartość własności projekty
i bezwzględnie ustala wartość wewnętrznej własności __proto__
jako Robotnik.prototype
(ta nazwa własności posiada dwa znaki podkreślenia na początku i dwa na końcu). Własność __proto__
decyduje o łańcuchu prototypu używanym do zwracania wartości własności. Gdy tylko własności te są ustalone, JavaScript zwraca nowy obiekt, a instrukcja przypisania przypisuje zmienną marek do tego obiektu.
Proces ten nie umieszcza wartości bezpośrednio w obiekcie marek
(wartości
lokalne
) dla własności, które marek
dziedziczy z łańcucha prototypu. Gdy pytasz o wartość własności, JavaScript najpierw sprawdza czy wartość istnieje w tym obiekcie. Jeśli tak, zwraca tę wartość. Jeśli wartość nie istnieje tam lokalnie, JavaScript sprawdza łańcuch prototypu (używając własności __proto__
). Jeśli obiekt w łańcuchu prototypu posiada wartość tej własności, jest ona zwracana. Jeśli własność nie zostanie znaleziona, JavaScript zgłasza, że obiekt nie posiada własności. W tym przypadku obiekt mark
posiada następujące własności i wartości:
marek.imie = ""; marek.dept = "ogólny"; marek.projekty = [];
Obiekt mark
dziedziczy wartości własności imie i dept z obiektu prototypowego w mark.__proto__
. Ma on również przypisaną przez konstruktor Robotnik wartość własności projekty. Dzięki temu otrzymujesz dziedziczenie własności i ich wartości w JavaScripcie. Niektóre subtelności tego procesu zostały przedyskutowane w Powrót dziedziczenia własności.
Ponieważ konstruktory te nie pozwalają na dostarczenie wartości specyficznych dla instancji, informacje te są ogólne. Wartościami własności są te domyślnie dzielone przez wszystkie nowe obiekty utworzone z Robotnik. Możesz oczywiście zmienić wartości dowolnej z tych własności. Mógłbyś podać określone informacje dla marek
tak jak pokazano poniżej:
marek.imie = "Doe, Marek"; marek.dept = "administrator"; marek.projekty = ["navigator"];