Documente Academic
Documente Profesional
Documente Cultură
1. Obiecte în JavaScript
Obiectele în JavaScript sunt dinamice, se pot schimba în orice moment al execuției codului. Ne amintim
că există două moduri de a crea un obiect: folosind constructorul Object sau folosind un literal obiect:
Ambele persoana1 și persoana2 sunt obiecte cu proprietatea nume. Apoi, ambele obiecte au
atribuită proprietatea varsta. Se poate face acest lucru imediat după definirea obiectului sau mai târziu.
Obiectele create se pot modifica constant (cu excepția faptului când este specificat contrariul!). Apoi, se
schimbă valoarea lui nume pentru fiecare obiect, valorile proprietății pot fi schimbate oricând. Atunci
când este adăugată o proprietate la un obiect, JavaScript folosește o metodă internă numită [[Put]]
asupra obiectului. Metoda [[Put]] creează un loc în obiect pentru a stoca proprietatea. Rezultatul
apelului metodei [[Put]] este crearea unei proprietăți proprii obiectului. Proprietatea este stocată
direct în instanță și toate operațiile pe acea proprietate trebuie realizate prin obiect.
Atunci când este atribuită o nouă valoare unei proprietăți existente are loc o operație separată numită
[[Set]] . Această operație înlocuiește valoarea curentă a proprietății cu cea nouă. În exemplul dat,
setarea numelui cu a doua valoare rezultă la apelarea lui [[Set]] :
persoana1 persoana1
persoana1
varsta 25 varsta 25
[[Put]] nume
în prima parte a diagramei, un literal obiect este folosit pentru a crea obiectul persoana1, adică se
efectuează un [[Put]] implicit pentru proprietatea nume. Atribuirea unei valori pentru
Programare Web - Curs 4
Reamintesc că metodele sunt doar proprietăți care fac referință la funcții, deci se poate căuta existența
unei metode în același mod. În următorul cod adaug o funcție, spuneNume() la persoana1 și folosesc
operatorul in pentru a confirma prezența funcției în obiect:
În majoritatea cazurilor, operatorul in este cea mai bună modalitate de a determina dacă o proprietate
există într-un obiect, deoarece are beneficiul de a nu evalua valoarea proprietății. În unele cazuri se poate
căuta existența unei proprietăți a unui obiect, doar dacă aceasta este o proprietate proprie acelui obiect.
Operatorul in caută și după proprietăți proprii și după proprietăți prototype, deci ne trebuie o altă
abordare.
Metoda hasOwnProperty() este prezentă la toate obiectele și returnează true doar dacă proprietatea
dată există și este o proprietate proprie obiectului. De exemplu, în următorul cod se compară rezultatul
folosirii operatorului in și a metodei hasOwnProperty() pe diferite proprietăți ale obiectului
persoana1:
Programare Web - Curs 4
În exemplul dat, nume este o proprietate proprie obiectului persoana1, deci ambele metode (atât
folosirea operatorului in cât și folosirea metodei hasOwnProperty()) întorc true.
Metoda toString() este o proprietate prototype care este prezentă la toate obiectele. Operatorul in
întoarce true pentru toString(), dar hasOwnProperty() întoarce false.
În exemplu este ștearsă proprietatea nume din obiectul persoana1. Operatorul in returnează false
după ce operația este completă. De asemenea, observați că accesul la o proprietate care nu există va
întoarce undefined.
3.3. Enumerarea
Implicit, toate proprietățile pe care le adăugăm unui obiect sunt numărabile, adică se pot folosi în bucle
for -in. Proprietățile numărabile au propriile atribute interne [[Enumerable]] setate la true. O
buclă for-in enumeră toate proprietățile numărabile ale unui obiect, atribuind numele proprietății unei
variabile. De exemplu, următoarea buclă produce numele proprietăților și valorile unui obiect:
De fiecare dată când se parcurge bucla for-in , variabilei property îi este atribuită următoarea
proprietate numărabilă a obiectului, până când toate proprietățile au fost folosite. La acel moment de
timp, bucla este terminată și se continuă execuția codului. În acest exemplu este folosită bracket
notation pentru a obține valoarea proprietății obiectului și a o afișa în consolă. Dacă avem nevoie de o
Programare Web - Curs 4
listă de proprietăți ale obiectului pe care să o folosim ulterior, se folosește metoda Object.keys()
pentru a obține un vector de nume de proprietăți numărabile ale obiectului object:
Există o diferență între proprietățile numărabile returnate de o buclă for-in și cele returnate de
Object.keys(). Bucla for-in enumeră și proprietățile prototype, în timp ce Object.keys() returnează doar
proprietăți proprii. Nu toate proprietățile sunt numărabile. Majoritatea metodelor proprii obiectelor au
atributele [[Enumerable]] setate la false. Dacă o proprietate a unui obiect este sau nu numărabilă
se verifică cu ajutorul metodei propertyIsEnumerable():
Proprietatea nume este numărabilă, fiind o proprietate proprie definită pe obiectul persoana1.
Proprietatea length din vectorul properties nu este numărabilă deoarece este o proprietate de tip
built-in pe Array.prototype.
Sintaxa folosită pentru definirea lui getter și setter pentru name arată la fel ca la funcții, dar fără a
se folosi cuvântul cheie function. Cuvintele speciale get și set sunt folosite în fața numelui
proprietății accesor, urmate de paranteze și un corp de funcție. Getter se așteaptă să întoarcă o
valoare, în timp ce setter primește acea valoare ca fiind atribuită proprietății ca un argument.