Obiekty w JavaScript
Ten dział jest jeszcze częścią strony Klasy
Tworzenie obiektów
JavaScript Object Notation (JSON)
Nowy obiekt można stworzyć bardzo łatwo, używając odpowiedniej składni:
var obiekt = { pole: "wartość", metoda: function(){} }
Stworzy nowy obiekt mający pole pole i metodę metoda
Nazwy pól w tej notacji nie muszą być otaczane w cudzysłów, o ile są zgodne z dopuszczalną składnią dla zmiennych JS. Jeśli zawierają spacje lub używają zarezerwowanych nazw, to należy je otaczać cudzysłowem:
{"function": "wartość", "inne pole": "wartość"}
Obiekt nie musi być przypisywany do zmiennej — może być anonimowy i np. przekazany od razu jako parametr funkcji.
Uwaga na przecinki! Notacja JavaScript jest bardzo rygorystyczna i nie pozwala na dostawienie zbędnego przecinka za ostatnim polem obiektu.
Nowe instancje
Za pomocą operatora new można tworzyć nowe obiekty klas.
Dostęp do pól
Istnieją dwie notacje umożliwiające odczyt wartości z pól obiektów:
obiekt["nazwapola"]
Odczyta pole o nazwie nazwapola z obiektu
Nazwa pola może być dowolna, a w przypadku, gdy nie zawiera ona znaków niedozwolonych w nazwach zmiennych, ani nie jest zarezerwowaną nazwą, to można użyć uproszczonego zapisu, który daje taki sam efekt:
obiekt.nazwapola
Odczyta pole o nazwie nazwapola z obiektu
Żeby odczytać pole o nazwie, która jest przechowywana w zmiennej (traktując obiekt jak tablicę asoscjacyjną), należy użyć notacji z []:
var zmiennepole = "jakieś.pole[]!";obiekt[zmiennepole]Odczyta pole o nazwie jakieś.pole[]! z obiektu
obiekt.zmiennepole
Odczyta pole o stałej nazwie „zmiennepole”, a nie o nazwie zawartej w zmiennej.
obiekt.jakieś.pole[]!
Nie zadziała, ponieważ nazwa pola miesza się ze składnią JavaScript tworząc zupełnie inną konstrukcję.
obiekt["jakieś.pole[]!"]
Znajdowanie wszystkich pól
Konstrukcja for(x in obiekt) będzie kolejno przypisywać zmiennej x nazwy pól z obiektu.
for(i in ob){alert("Pole " + i + " ma wartość: " + ob[i]);}
Kopiowanie obiektów
Nie ma prostego sposobu na zrobienie kopii obiektu. W JavaScript wszystkie obiekty są przekazywane i przypisywane przez referencję, czyli:
var a = {jakis: "obiekt"}var b = a/* tylko przypisze referencję, a nie skopiuje obiekt */
Zmienne a i b będą wskazywały na dokładnie ten sam obiekt i zmiana a zawsze zmieni b.
Żeby wykonać niezależną kopię obiektu, należy rekurencyjnie skopiować wszystkie jego pola do nowego obiektu. Można to uczynić dodając do prototypu obiektu Object (po którym dziedziczą wszystkie inne obiekty) funkcję zwracającą nowy obiekt ze skopiowanymi polami, np.:
Object.prototype.clone = function() {var n = {};for (p in this) {n[p] = this[p];}return n;}
Usuwanie obiektów i pól
Elementy tablic usuwa metoda splice
Nie trzeba martwić się o usuwanie obiektów — gdy obiekt nie jest używany, zostanie automatycznie usunięty przez garbage collector.
Za pomocą operatora delete można usuwać obiekty poprzez usunięcie pól, do których są przypisane:
window.foo = new Object();delete window.foo
Zmodyfikowano: 21.11.2008, 01:10