|
Obiekty można tworzyć instrukcją new Object,
a następnie można dodawać do nich właściwości.
W rzeczywistości obiekty są słownikami (tablicami asocjacyjnymi)
i w taki sposób można je też definiować oraz odwoływać się do ich pól.
Warto wiedzieć, że zmienna przechowująca obiekt jest wskaźnikiem
(referencją) do tego obiektu - tak jak w Javie.
|
|
Funkcja jest obiektem, a więc wskaźnik do niej może być składnikiem obiektu.
Jeżeli funkcja jest wywołana na rzecz konkretnego obiektu, to dysponuje
zmienną this zawierającą wskaźnik do tego obiektu.
Przedstawiony przykład ilustruje przy okazji trzy różne sposoby
definiowania funkcji.
|
|
Dzięki słabej kontroli typów oraz traktowaniu obiektów jako słowników
mamy tu do czynienia z pewnym rodzajem polimorfizmu funkcji (działanie
metody zależy od typu obiektu, na rzecz którego jest ona wykonywana).
Chociaż tak właściwie to ilustrowana tu własność wynika raczej stąd,
że każdy obiekt przechowuje adres do swojej własnej metody,
więc nie jest to taki polimorfizm jak np. w C++ i na dobrą sprawę
dałoby się go też zaprogramować w C, tworząc strukturę (struct),
której jednym z pól byłby adres funkcji skojarzonej z obiektem.
|
|
Obiekty zdefiniowane przez użytkownika tworzy się za pomocą
funkcji nazywanej konstruktorem. Jest to zwykła funkcja,
którą można zastosować do utworzenia i inicjalizacji nowego obiektu
instrukcją new NazwaFunkcji
albo new NazwaFunkcji (argumenty).
W czasie swojego działania funkcja ta dysponuje
zmienną lokalną this, która jest wskaźnikiem do utworzonego obiektu.
Obiekt taki uzyskuje automatycznie właściwość o nazwie constructor
będący adresem funkcji użytej po słowie kluczowym new.
Inne właściwości mogą być dodane do obiektu podczas jego konstrukcji
lub później. Uwaga: Metody są dodawane do każdego obiektu z osobna
i w szczególności każda z nich może być inna, tak jak w tym przykładzie
(na marginesie: pokazana tu sztuczka z "zaszywaniem" zmiennych lokalnych
w funkcjach jest czasem nazywana domykaniem, ang. closure).
|
|
Każda funkcja ma właściwość o nazwie prototype. Jest to obiekt
(dokładniej: adres obiektu) używany w sytuacji, gdy wystąpi próba
dostania się do nieistniejącego składnika obiektu
utworzonego tą funkcją (jako konstruktorem).
Dodając właściwości do prototypu, uzyskujemy efekt,
który w C++ odpowiada zmiennym statycznym klasy.
W szczególności funkcje dodane do prototypu są wspólne dla wszystkich
obiektów klasy i przez to bardziej odpowiadają metodom w C++.
|
|
Typy proste w JavaScripcie to undefined, null,
string, number i boolean. Pozostałe typy to obiekty,
przy czym obiekty dysponujące kodem wykonywalnym to funkcje.
Typ danych przechowywanych w zmiennej można sprawdzić operatorem typeof.
Zarówno każdy obiekt, jak i zmienna typu prostego ma właściwość
constructor, przy czym w przypadku zmiennych prostych
jest to adres konstruktora odpowiadającego jej obiektu: String,
Number lub Boolean. Uwaga: funkcja zawsze jest obiektem,
niezależnie od sposobu jej definicji.
|
|
Pewien rodzaj dziedziczenia w JavaScripcie jest możliwy do zrealizowania
za pomocą podmiany obiektu prototype na wcześniej skonstruowany
inny obiekt. Nie odpowiada to oczywiście idei dziedziczenia znanej np. z C++,
ponieważ obiekt klasy pochodnej nie zawiera w sobie obiektu klasy podstawowej,
lecz jedynie może korzystać z właściwości jednego, skonstruowanego wcześniej
obiektu klasy podstawowej.
|