JavaScript dla każdego
//  wróć   główna   dalej  //

Nowe obiekty

new this with

Możliwość tworzenia nowych obiektów, to duży atut dla języka programowania. Także JavaScript daje taką możliwość. Nowe obiekty dają dostępu do nowych właściwości, czy metod na rzecz nich samych (o ile takie zdefiniujemy). Pozwalają tworzyć bardziej precyzyjnie i rozbudowane zmienne. Wykorzystuje się je w bardziej złożonych skryptach, gdzie ilość danych jest bardzo duża i zróżnicowana. Nowe obiekty pozwalają je czytelniej pogrupować. Wykorzystanie obiektów może być takie samo, jak struktur w języku C lub rekordów w Pascalu.

Oto prosty przykład funkcji, która będzie zawierała dane obiektu:

function Datownik()
{
 this.Wiek="XXI";
 this.IleDni=new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
 this.Skroty=new Array("Pn", "Wt", "Sr", "Cz", "Pt", "So", "Nd");
}

Tak stworzona funkcja zawiera dane o miesiącu i dniach tygodnia. Wiek jest zmienną typu string, zawiera informacje o bieżącym wieku. Kolejne zmienne zostały zdefiniowane jako zmienne tablicowe (więcej I>>). IleDni zawiera ilość dni poszczególnych miesięcy (z pominięciem roku przestępnego). Do stworzenia tych danych niezbędne jest użycie słowa this. W ten sposób informacje zawarte w tablicach są częścią funkcji, a nie jej lokalna zmienną.

Kolejnym etapem tworzenia jest otrzymanie dostępu do tego obiektu. Odbywa się to zawsze przy pomocy słowa kluczowego new, na przykład:

Czas=new Datownik();

Czas jest teraz obiektem (klasy Datownik). Teraz można już uzyskać dostęp do danych przechowywanych przez nowo stworzony obiekt. Odwołanie się do niego odbywa się poprzez zdefiniowaną zmienną Czas i odpowiednią wartość w funkcji (zawsze rozdzielone kropką), na przykład tak:

dzien=Czas.IleDni[8];

Takie odwołanie spowoduje przejście do zmiennej dzien zostanie przypisana wartość 30, komórki tablicy indeksowane są od zera.

Proponuje rozbudować obiekt o możliwość ustalenia, czy dany rok jest przestępny i możliwość szybkiego dostępu do liczby dni tego roku. Funkcja będzie pobierać wartość logiczną równą true, jeśli dany rok jest przestępny i false dla normalnego. Ponadto stworzy nową właściwość, która będzie przechowywać liczbę dni. Ostatecznie można tak zbudować funkcję Datownik:

function Datownik(przestepny)
{
 var i;
 this.Wiek="XXI";
 this.IleDni=new Array(31, 28+(przestepny ? 1 : 0),
 	 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
 this.Skroty=new Array("Pn", "Wt", "Sr", "Cz", "Pt", "So", "Nd");
	
 this.suma=0; //wartosc poczatkowa
 for (i=0; i<12; i++) this.suma+=this.IleDni[i];
}
kalendarz=new Datownik(true); //tworzy nowy "rok", przestępny
alert(kalendarz.suma); //wyświetla ilość jego dni

Mimo, że zmienna i jest dostępna w całej funkcji, ale nie dodano do niej słowa this, toteż jest ona lokalną i odwołanie kalendarz.i jest błędne.

Można także tworzyć nowe obiekty w już istniejących. W takim przypadku zamiast this.Wiek, można przypisać nowy obiekt poprzez this.Wiek=new Stulecia(). Odwołanie się do takiego obiektu składałoby się z trzech członów. Stulecia byłoby nową funkcją, którą także należy wcześniej zdefiniować.

Poniżej znajdziesz ciekawy przykład zastosowania nowych obiektów - kalendarz miesięczny. Jeżeli masz jeszcze jakieś wątpliwości, to ten skrypt pozwoli je rozwiać. Zobacz, jak wygląda to w praktyce.

Zobacz przykład

Przy pomocy słowa kluczowego with można sobie uprościć zapis, jeśli odwołujemy się do tego samego obiektu wielokrotnie, np:

with (document)
{
 write("Wiadomosc");
 write("Pierwsza jest dobra");
 write("Z drugą jest gorzej");
}

Wszelkie instrukcje w tak zdefiniowanym bloku będą się odnosić do obiektu zawartego przy słowie with, dlatego też jego nazwę można opuścić, co czasem bardo uprasza zapis.

Jest jeszcze inna alternatywa, o wiele wygodniejsza, bo pozwala skracać wiele poleceń jednocześnie i nie ma ograniczeń do jednego bloku. Załóżmy, że polecenie odwołania się do konkretnego elementu formularza (więcej I>>) jest powtarzane wielokrotną ilość razy, wtedy takie skrócenie staje się wygodniejsze:

document.Form.Test.value="Wpisz emaila";

Można rozwiązać ten problem poprzez zastosowanie dowolnej zmiennej, której należy przypisać dany obiekt:

F=document.Form.Test;

Zmiennej F przypisałem tylko obiekt, bez właściwości value. Podobnie jak metody, właściwości nie można przypisać nowej zmiennej. Należy ją przywołać przy każdorazowym użyciu nowego obiektu. Po takiej modyfikacji można otrzymać dostęp do dowolnej właściwości, która przypisze nową wartość, powodując w ten sposób modyfikację w formularzu:

F.value="Wpisz go!"

Dzieje się tak dlatego, że zmienna F zawiera adres obiektu, któremu można przypisywać własności i metody. W tym przypadku wartość VALUE elementu formularza będzie wynosiła Wpisz go!.

Przy okazji tworzenia nowych obiektów można przy pomocy pętli for ( in) sprawdzić, czy dana właściwość jest obsługiwana przez daną przeglądarkę. Jest to bardzo wygodna sprawdzenia właściwości, jeśli się jej nie pamięta lub zachodzi konieczność sprawdzenia, jak obiekt został zaimplementowany. Oto instrukcja, która wypisze na ekran wszystkie właściwości obiektu document

for (i in document) document.write(i+" ");

Efekt może Cie zadziwić:

To, co widać na ekranie zależy przede wszystkim, jakiej przeglądarki używasz i w jakiej wersji. Wiele z tych właściwości jest dostępnych tylko w nowych wersjach (tzw Twoja przeglądarka już je obsłuży) przeglądarek i to w niektórych. W każdej z nich ta lista będzie inna, wiele z nich to już Dynamiczny HTML nie mniej jednak często takie rozwiązanie jest pomocne.

Czy dany obiekt (np document.images) jest obsługiwany można sprawdzić następująco:

alert("Ten obiekt "+(document.images ? "": "nie ")+
 "jest dostępny w Twojej przeglądarce");

Do góry