Programowanie obiektowo orientowane w JavaScripcie

(oprac. Paweł Pilarczyk)

Niniejsza strona wyjaśnia i demonstruje na konkretnych przykładach różne aspekty programowania obiektowo orientowanego w JavaScripcie.

Instrukcja obsługi i wskazówki:

Życzę miłej zabawy!

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.

Inne przydatne właściwości i metody definiowane domyślnie w JavaScripcie, które być może warto sprawdzić (we własnym zakresie): hasOwnProperty, isPrototypeOf, propertyIsEnumerable

All trademarks, registered trademarks or brand names are property of the respective holders and used in this document for descriptive purposes only.
Copyright © 2005 by Pawel Pilarczyk. All rights reserved.