Niedziela 19 Maj 2024r. Godz 00:00:00      
Postów: 251      

Obiekty w JavaScript

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ć w cudzysłów:

 {"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.

Za pomocą operatora new można robić nowe obiekty klas.

Są 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, ale w przypadku, gdy nazwa pola nie zawiera 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[]!"]

Konstrukcja for(x in obiekt) będzie zmiennej x kolejno przypisywać nazwy pól z obiektu.

  for(i in ob)
  {
    alert("Pole " + i + " ma wartość: " + ob[i]);
  }

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 obiektu */

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 dzidziczą wszystki 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;
 }

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