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 ab 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, 04:56
submit