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
Obiekty można zagnieżdżać.
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 (lub apostrofem):
{"function": function(element, tekst){element = document.createElement(element);element.appendChild(document.createTextNode(tekst));document.documentElement.lastChild.appendChild(element);/* DOM */}, "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.
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 = "jakies.pole";obiekt[zmiennepole]Odczyta pole o nazwie jakies.pole z obiektu
obiekt.zmiennepole//Odczyta pole o stałej nazwie "zmiennepole", a nie o nazwie zawartej w zmiennej.
var obiekt = {jakies.pole: 1};obiekt.jakies.pole//Nie zadziała, ponieważ nazwa pola miesza się ze składnią JavaScript tworząc zupełnie inną konstrukcję.
var obiekt = {jakies: {pole: 1}};obiekt.jakies.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
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={};delete window.foo;
Zmodyfikowano: 20.09.2011, 11:56