Načrtovanje in razvoj spletnih aplikacij

Objekti in razredi v JavaScriptu

Objekti v JavaScriptu so sestavljene vrednosti, v katerih podatke in funkcije povezujemo v smiselno celoto. Objekt vsebuje lastnosti, ki hranijo vrednosti, in metode, ki izvajajo dejanja nad temi podatki. V sodobni kodi objekte zelo pogosto ustvarjamo z objektnim literalom, lahko pa tudi z zapisom class, ki omogoča preglednejši zapis konstruktorjev in metod.

Pomni: Čeprav JavaScript pozna zapis class, so objekti v svojem bistvu še vedno objekti s prototipi. Zapis class je predvsem preglednejši način za opis konstruktorja, metod in dedovanja.

Osnovna pravila

  • Objekt je zbirka lastnosti, kjer ima vsaka lastnost ime in vrednost.
  • Vrednost lastnosti je lahko poljubnega tipa, tudi drug objekt ali funkcija.
  • Metoda je lastnost objekta, katere vrednost je funkcija.
  • Do lastnosti dostopamo z operatorjem . ali z zapisom v oglatih oklepajih [].
  • V sodobni kodi objekte pogosto ustvarjamo z objektnim literalom ali z zapisom class.

Primerjave

Objektni literal

Objektni literal je najpogostejši in najbolj neposreden način ustvarjanja objekta. Objekt zapišemo med zavita oklepaja, lastnosti pa med seboj ločimo z vejicami. Imena lastnosti so lahko običajna imena, nizi ali računani izrazi.

const racunalnik = {
   vrsta: "prenosnik",
   znamka: "HP",
   zaloga: 10
};

Objekt lahko vsebuje tudi vgnezdene objekte:

const racunalnik = {
   vrsta: "namizni računalnik",
   znamka: "PCX",
   pomnilnik: {
      delovni: "8 GB",
      graficni: "2 GB"
   },
   zaloga: 7
};

Lastnosti in metode

Lastnosti hranijo podatke, metode pa izvajajo dejanja. V sodobnem JavaScriptu lahko metodo v objektu zapišemo tudi v krajšem zapisu brez besede function.

const racunalnik = {
   vrsta: "prenosnik",
   znamka: "HP",
   zaloga: 10,
   izpis() {
      return this.znamka + " (" + this.vrsta + ")";
   }
};

Pomni: Metoda je lastnost objekta, katere vrednost je funkcija. Kadar metoda uporablja this, se ta navadno nanaša na objekt, prek katerega metodo pokličemo.

Dostop do lastnosti

Do lastnosti objekta dostopamo na dva pogosta načina. Zapis z operatorjem . uporabimo, kadar je ime lastnosti običajen identifikator. Zapis z oglatimi oklepaji [] pa uporabimo, kadar je ime lastnosti shranjeno v spremenljivki, vsebuje posebne znake ali ga izračunamo med izvajanjem.

const oseba = {
   ime: "Ana",
   priimek: "Novak",
   "rojstno leto": 2007
};

oseba.ime;
oseba["priimek"];
oseba["rojstno leto"];

Do vgnezdenih lastnosti dostopamo po korakih:

const racunalnik = {
   pomnilnik: {
      graficni: "2 GB"
   }
};

racunalnik.pomnilnik.graficni;

Pozor: Zapis objekt.ime ni primeren, kadar ime lastnosti ni veljaven identifikator, na primer pri imenu "rojstno leto". V takem primeru uporabimo zapis objekt["rojstno leto"].

Dodajanje in brisanje lastnosti

Objektu lahko po ustvarjanju dodamo novo lastnost s preprosto prireditvijo. Lastnost lahko tudi odstranimo z operatorjem delete. Ta operator odstrani lastnost objekta, ne pa samega objekta.

const prenosnik = {
   znamka: "HP",
   zaloga: 10
};

prenosnik.dobavitelj = "Avtera d.o.o.";
delete prenosnik.dobavitelj;

Pri oglatih oklepajih lahko dodamo tudi lastnost z imenom, ki ga določimo med izvajanjem:

const lastnost = "barva";
prenosnik[lastnost] = "siva";

Pozor: Operator delete praviloma briše lastnost objekta. Ne uporablja se kot splošen mehanizem za “brisanje objekta” ali za neposredno sproščanje pomnilnika.

this

Beseda this se v metodah pogosto uporablja za dostop do lastnosti istega objekta. Tako lahko ista metoda deluje na različnih objektih, odvisno od tega, prek katerega objekta jo pokličemo.

<p id="primer1"></p>
<script>
{
   const prenosnik = {
      znamka: "HP",
      zaloga: 10,
      povecajZalogo(sprememba) {
         this.zaloga += sprememba;
         return this.zaloga;
      }
   };

   document.getElementById("primer1").textContent =
      "Nova zaloga je " + prenosnik.povecajZalogo(5) + ".";
}
</script>

class

V sodobni kodi pogosto uporabljamo zapis class, kadar želimo pregledneje opisati objektni vzorec, konstruktor in metode. Konstruktor inicializira novo instanco, metode pa opišemo znotraj telesa razreda.

class Racunalnik {
   constructor(vrsta, znamka, zaloga) {
      this.vrsta = vrsta;
      this.znamka = znamka;
      this.zaloga = zaloga;
   }

   povecajZalogo(sprememba) {
      this.zaloga += sprememba;
      return this.zaloga;
   }
}

const tablica = new Racunalnik("tablica", "Apple", 22);

Tak zapis je pogosto preglednejši od starejšega konstruktorja, zapisanega z običajno funkcijo in operatorjem new. Vseeno pa tudi pri uporabi class še vedno delamo z JavaScript objekti.

Priporočila

  • Za preproste objekte pogosto uporabljaj objektni literal.
  • Za preglednejši opis konstruktorjev in metod v sodobni kodi razmisli o zapisu class.
  • Pri dostopu do običajnih imen lastnosti uporabljaj ., pri posebnih ali izračunanih imenih pa [].
  • Metode zapisuj tako, da njihovo delovanje jasno izhaja iz imena in uporabljenih lastnosti.
  • Pri spreminjanju objektov uporabljaj dodajanje in brisanje lastnosti premišljeno, da struktura objekta ostane pregledna.

Pogoste napake

  • Objekt se razlaga, kot da mora nujno pripadati “razredu” v klasičnem smislu, čeprav je JavaScript v osnovi prototipni jezik.
  • Za dostop do lastnosti se uporabi operator ., čeprav ime lastnosti ni veljaven identifikator.
  • Operator delete se razlaga kot splošno “brisanje objekta”, čeprav v običajni rabi odstrani lastnost objekta.
  • Metoda spremeni napačno lastnost ali pa pomotoma prepiše samo metodo namesto podatka.
  • Beseda this se razume kot stalna vrednost, čeprav je njen pomen odvisen od načina klica funkcije ali metode.