Sunteți pe pagina 1din 5

Programare Web - Curs 4

Programarea orientată-obiect în JavaScript

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.

Proprietățile proprii sunt diferite de proprietățile prototype!!

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

nume Ilie nume Grigore


nume Ilie

varsta 25 varsta 25
[[Put]] nume

[[Put]] varsta [[Set]] 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

persoana1.varsta duce la un [[Put]] implicit pentru proprietatea varsta. Setarea lui


persoana1.nume cu o nouă valoare (Grigore) duce la o operație[[Set]] pe proprietatea nume,
suprascriind valoarea deja existentă a acesteia.

1.1. Detectarea proprietăților unui obiect


Din cauză că proprietățile pot fi adăugate în orice moment, uneori mai este necesară și o căutare a unei
proprietăți într-un obiect. Acest lucru nu se face cu if, așa cum poate ați gândit , ci cu operatorul in,
care caută după o proprietate cu un nume dat într-un obiect specific și returnează true dacă o găsește:

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.

1.2. Înlăturarea proprietăților unui obiect


Așa cum proprietățile pot fi adăugate obiectelor la orice moment de timp, ele pot fi și înlăturate. Setarea
unei proprietăți la null nu o înlătură complet din obiect! O astfel de operație numită [[Set]] cu o
valoare de null, așa cum am văzut în diagramele de mai sus, doar înlocuiește valoarea proprietății.
Pentru a înlătura total o proprietate dintr-un obiect trebuie folosit operatorul delete. Acesta acționează
asupra unui singur obiect și apelează o operație internă numită [[Delete]]. Atunci când operatorul
delete acționează va întoarce true (unele proprietăți nu pot fi înlăturate):

Î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.

3.4. Tipuri de proprietăți


Există două tipuri diferite de proprietăți: proprietăți de date ce conțin o valoare precum proprietatea
nume din exemplul anterior (comportamentul metodei [[Put]] este de a crea o proprietate de date) și
proprietăți accesor ce nu conțin o valoare, ci definesc o funcție pentru a o apela atunci când proprietatea
este citită (getter) și o funcție pentru a o apela atunci când proprietatea este scrisă (setter).

Sintaxa pentru a defini o proprietate accesor folosind un literal obiect:


Programare Web - Curs 4

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.

3.5. Atribute proprietate


Înainte de ECMAScript 5 nu exista o modalitate de a specifica dacă o proprietate este sau nu numărabilă,
de fapt nu exista nici o modalitate de acces a atributelor interne ale unei proprietăți. ECMAScript 5 a
introdus mai multe căi de a interacționa cu atributele proprietății în mod direct, precum și noi atribute
pentru a suporta diverse funcționalități. Astfel a devenit posibilă crearea de proprietăți care se comportă
la fel cu proprietățile implicite (built-in) JavaScript.

S-ar putea să vă placă și