Reference u JavaScriptu
Za razliku od običnih vrednosti, tipa string ili broj, objekte ne možemo bukvalno da "smestimo" u promenljivu. Kada promenljivoj "dodelimo" objekat, ta promenljiva je samo referenca na njega.
Naravno, u praktičnom radu sa objektom, nećemo primetiti razliku, ali moramo da pamtimo da referenca samo pokazuje na objekat u memoriji. Ona je u stvari adresa objekta, pre nego sam objekat.
var promenljiva = vrednost;
var referenca = objekat;
Često i nismo svesni koliko koristimo reference dok programiramo u JavaScriptu. Svaka promenljiva preko koje pozivamo objekat je referenca. Reference se koriste i kada funkciji prosleđujemo objekat putem parametara. Čak i na same funkcije možemo praviti reference.
Međutim, reference kriju jednu opasnu osobinu, koja nas može skupo koštati ako je ikada zaboravimo: referenca na referencu ne pokazuje na novi, već na originalni objekat!
Evo kako to funkcioniše sa promenljivama:
var p = vrednost;
var p1 = p;
Promenljiva p1 je kopija promenljive p. Inicijalno one imaju istu vrednost, ali su suštinski nezavisne - šta god uradili sa promenljivom p1, neće se odraziti na promenljivu p.
Sa druge strane, slična situacija, ali kada umesto vrednosti koristimo objekat:
var r = objekat;
var r1 = r;
Promenljiva r je referenca na objekat. Promenljiva r1 je kopija promenljive r, ali u smislu da samo pokazuje na isti objekat. To znači da su obe promenljive reference na isti objekat. Ako menjamo svojstva "objekta" r1, to će se odraziti i na "objekat" r.
Primer za reference
Da se oslonimo na primer od malopre
var x = 10; // promenljiva x dobija vrednost
var y = x; // promenljiva y dobija istu tu vrednost
y = y+1; // povećali smo vrednost y za 1 - to ne utiče na promenljivu x
var pasus = document.getElementById("prvi"); // pasus je referenca na objekat
var ref = pasus; // ref je takođe referenca na objekat
ref.style.color = "#900"; // šta god radili sa ref, odraziće se i na pasus
ref = null; // poništavamo referencu ref
Dakle kreirali smo referencu pasus na HTML elemenat "prvi". Onda smo "dodelili vrednost" promenljivoj ref. Jedino što je to potpuno drugačije u odnosu na rad sa promenljivama x i y koje sadrže "primitivne" vrednosti.
I pasus i ref pokazuju na isti objekat u memoriji (tj. u dokumentu) i samim tim, sve što radimo sa objektom ref, dešava se i objektu pasus, jer su to u stvari reference na jedan isti objekat.
Konačno, u poslednjoj naredbi dodeljujemo referenci ref "nulti" objekat. Vrednost null je za objekte ono što je 0 (nula) za brojeve ili "" (prazan string) za stringove. Ovo ne znači da smo "obrisali" objekat - samo smo ukinuli referencu na njega - i dalje mu možemo pristupati preko reference pasus.