Lucrul cu obiecte și proprietăți

Un obiect complex poate să dețină orice valoare JavaScript permisă. În următorul cod, creez un Obiect() obiect numit myObject și apoi adăugați proprietăți care reprezintă majoritatea valorilor disponibile în JavaScript.


Obiecte complexe

Mostră: sample29.html

 

Simplul concept de învățat aici este faptul că obiectele complexe pot conține sau se referă la tot ce se poate exprima nominal în JavaScript. Nu trebuie să vă surprindeți când vedeți acest lucru, deoarece toate obiectele native pot fi mutate. Acest lucru se aplică chiar și pentru Şir(), Număr(), și Boolean () valori în forma obiectului lor, adică când sunt create cu nou operator.


Încapsularea obiectelor complexe într-un mod programabil benefic

Obiect(), Array (), și Funcţie() obiectele pot conține alte obiecte complexe. În exemplul următor, demonstrez acest lucru prin configurarea unui arbore obiect folosind Obiect() obiecte.

Mostră: sample30.html

 

Același lucru se poate face și cu un Array () obiect (aka matrice multidimensională), sau cu a Funcţie() obiect.

Mostră: sample31.html

 

Principalul concept care trebuie luat aici este că unele obiecte complexe sunt concepute pentru a încapsula alte obiecte într-un mod benefic.


Obținerea, setarea și actualizarea proprietăților obiectului utilizând notația Dot sau notația consolei

Putem obține, seta sau actualiza proprietățile obiectului utilizând notația punctului sau notația bracket.

În exemplul următor, dau notație punctuală, care se realizează utilizând numele obiectului urmat de o perioadă și apoi urmat de proprietate pentru a obține, seta sau actualiza (de ex.., objectName.property).

Mostră: sample32.html

 

Notația Dot este cea mai obișnuită notație pentru obținerea, setarea sau actualizarea proprietăților unui obiect.

Notele de notare, dacă nu este necesar, nu sunt la fel de utilizate în mod obișnuit. În următorul eșantion, înlocuiesc notația punctului folosită în eșantionul precedent cu notația bracket. Numele obiectului este urmat de un bracket de deschidere, numele proprietății (în citate) și apoi o paranteză de închidere:

Mostră: sample33.html

 

Notația pentru notație poate fi foarte utilă atunci când trebuie să accesați o cheie de proprietate și cu ce trebuie să lucrați este o variabilă care conține o valoare de șir reprezentând numele proprietății. În următorul eșantion, demonstrez avantajul unei notații de notație pe notația punctului prin utilizarea acestuia pentru a accesa proprietatea foobar. Fac aceasta folosind două variabile care, când s-au alăturat, produc versiunea string a cheii de proprietăți conținută în foobarObject.

Mostră: sample34.html

 

În plus, notația de tip bracket poate fi folosită pentru a obține nume de proprietăți care sunt identificatori JavaScript incorecte. În codul următor, folosesc un cuvânt cheie cu un număr și un cuvânt rezervat ca nume de proprietate (valabil ca un șir) pe care doar notația de tip bracket poate accesa.

Mostră: sample35.html

 

Deoarece obiectele pot conține alte obiecte, cody.object.object.object.object sau cody [ 'obiect'] [ 'obiect'] [ 'obiect'] [ 'obiect'] pot fi văzute uneori. Aceasta se numește înlănțuirea obiectelor. Încapsularea obiectelor poate dura pe termen nelimitat.

Obiectele sunt mutabile în JavaScript, ceea ce înseamnă că obținerea, setarea sau actualizarea lor poate fi efectuată pe majoritatea obiectelor în orice moment. Folosind notația bracket (de ex., cody [ 'varsta']), puteți imita matrice asociative găsite în alte limbi.

Dacă o proprietate în interiorul unui obiect este o metodă, tot ce trebuie să faceți este să utilizați () operatori (de ex., cody.getGender ()) pentru a invoca metoda proprietății.


Ștergerea proprietăților obiectului

șterge operatorul poate fi folosit pentru a elimina complet proprietățile dintr-un obiect. În următorul fragment de cod, ștergem bar proprietate de la foo obiect.

Mostră: sample36.html

 

șterge nu va șterge proprietățile care se găsesc pe lanțul prototip.

Ștergerea este singura modalitate de a elimina o proprietate dintr-un obiect. Setarea unei proprietăți la nedefinit sau nul modifică numai valoarea proprietății. Nu elimină proprietatea din obiect.


Cum sunt rezolvate referințele la proprietățile obiectului

Dacă încercați să accesați o proprietate care nu este inclusă într-un obiect, JavaScript va încerca să găsească proprietatea sau metoda utilizând lanțul prototip. În următorul exemplu, creez o matrice și încerc să accesez o proprietate numită foo care nu a fost încă definit. S-ar putea să credeți asta pentru că myArray.foo nu este o proprietate a myArray obiect, JavaScript va reveni imediat nedefinit. Dar JavaScript va arăta în încă două locuri (Array.prototype și apoi Object.prototype) pentru valoarea lui foo înainte de a se întoarce nedefinit.

Mostră: sample37.html

 

proprietatea. Dacă are proprietatea, va returna valoarea proprietății și nu există nicio moștenire care apare deoarece lanțul prototip nu este utilizat în mod leveraging. Dacă instanța nu are proprietatea, atunci JavaScript va căuta pe funcția constructorului obiectului prototip obiect.

Toate instanțele obiect au o proprietate care este o legătură secretă (aka __proto__) la funcția constructor care a creat instanța. Această legătură secretă poate fi folosită pentru a apuca funcția constructorului, în special proprietatea prototip a funcției constructor instanțe.

Acesta este unul dintre aspectele cele mai confuze ale obiectelor din JavaScript. Dar să explicăm asta. Amintiți-vă că o funcție este, de asemenea, un obiect cu proprietăți. Este logic să permiteți obiectelor să moștenească proprietăți din alte obiecte. Așa cum spuneam: "Hei obiect B, aș vrea să împărtășiți toate proprietățile pe care le are obiectul lui A". JavaScript rulează toate aceste lucruri pentru obiectele native în mod prestabilit prin prototip obiect. Când creați propriile funcții ale constructorului, puteți utiliza și lanțul prototip.

Cum se realizează JavaScript exact acest lucru este confuz până când îl vedeți pentru ceea ce este: doar un set de reguli. Să creăm o matrice pentru a examina prototip proprietate mai aproape.

Mostră: sample38.html

 

Al nostru Array () exemplu este un obiect cu proprietăți și metode. Când accesăm una dintre metodele de matrice, cum ar fi a adera(), Să ne întrebăm: Crearea instanței myArray de la Array () constructor au propriile lor a adera() metodă? Sa verificam.

Mostră: sample39.html

 

Nu, nu face. Totuși myArray are acces la a adera() ca și cum ar fi proprietatea sa. Ce s-a intamplat aici? Ei bine, tocmai ați observat lanțul prototip în acțiune. Am accesat o proprietate care, deși nu este inclusă în obiectul myArray, ar putea fi găsită de JavaScript în altă parte. Că în altă parte este foarte specifică. Cand Array () constructor a fost creat de JavaScript, a adera() a fost adăugată metoda (printre altele) ca proprietate a prototip proprietatea Array ().

Pentru a reitera, dacă încercați să accesați o proprietate pe un obiect care nu îl conține, JavaScript va căuta prototip lanț pentru această valoare. Mai întâi se va uita la funcția constructor care a creat obiectul (de ex., mulțime) și inspectați-i prototipul (de ex., Array.prototype) pentru a vedea dacă proprietatea poate fi găsită acolo. Dacă primul obiect prototip nu are proprietatea, atunci JavaScript continuă să caute lanțul la constructorul din spatele constructorului inițial. Se poate face acest lucru până la sfârșitul lanțului.

Unde se termină lanțul? Să examinăm din nou exemplul invocând toLocaleString () metoda pe myArray.

Mostră: sample40.html

 

toLocaleString () metoda nu este definită în cadrul myArray obiect. Deci, regula de legare prototip este invocată și JavaScript caută proprietatea în mulțime constructori proprietăți prototip (de ex., Array.prototype). Nu este nici acolo, deci regula lanțului este invocată din nou și căutăm proprietatea în Obiect() prototip proprietate (Object.prototype). Și da, se găsește acolo. Dacă nu ar fi fost găsit acolo, JavaScript ar fi produs o eroare care să ateste că proprietatea era nedefinit.

Deoarece toate proprietățile prototipului sunt obiecte, legătura finală din lanț este Object.prototype. Nu există nicio altă proprietate prototip constructor care să poată fi examinată.

Există un întreg capitol înainte care descompune lanțul prototip în părți mai mici, așa că, dacă acest lucru a fost complet pierdut, citiți acel capitol și apoi reveniți la această explicație pentru a vă consolida înțelegerea. Din această scurtă citire pe această temă, sper că înțelegeți că atunci când o proprietate nu este găsită (și considerată nedefinit), JavaScript va fi analizat mai multe obiecte prototip pentru a determina dacă este o proprietate nedefinit. O căutare apare mereu, iar acest proces de căutare este modul în care JavaScript se ocupă de moștenire, precum și de căutări simple de proprietăți.


Utilizarea hasOwnProperty pentru a verifica dacă o proprietate a obiectului nu este din lanțul prototip

In timp ce în operatorul poate verifica proprietățile unui obiect, inclusiv proprietățile din lanțul prototip, hasOwnProperty metoda poate verifica un obiect pentru o proprietate care nu este din lanțul prototip.

În exemplul următor, vrem să știm dacă myObject conține proprietatea foo, și că nu moștenește proprietatea din lanțul prototip. Pentru a face acest lucru, ne întrebăm dacă myObject are propria sa proprietate numită foo.

Mostră: sample41.html

 

hasOwnProperty metoda ar trebui să fie puse în aplicare atunci când aveți nevoie pentru a determina dacă o proprietate este locală la un obiect sau moștenit de la lanțul prototip.


Verificarea dacă un obiect conține o proprietate dată folosind în Operator

în operatorul este folosit pentru a verifica (adevărat sau fals) dacă un obiect conține o proprietate dată. În acest exemplu, verificăm dacă foo este o proprietate în myObject.

Mostră: sample42.html

 

Ar trebui să știți că în operatorul nu numai că verifică proprietățile conținute în obiectul la care se face referire, ci și orice proprietăți pe care obiectele le mostenesc prin intermediul prototip lanţ. Astfel, se aplică aceleași reguli de căutare a proprietății și proprietatea, dacă nu în obiectul curent, va fi căutată pe prototip lanţ.

Aceasta înseamnă că myObject din proba anterioară conține, de fapt, a toString metoda de proprietate prin prototip lanț (Object.prototype.toString), chiar dacă nu am specificat una (de ex., myObject.toString = 'foo').

Mostră: sample43.html

 

În ultimul exemplu de cod, proprietatea toString nu este literalmente în interiorul obiectului myObject. Cu toate acestea, este moștenit de la Object.prototype, și așa mai departe în operatorul concluzionează că myObject are de fapt un moștenit toString () proprietate.


Enumerate (Loop Over) o proprietate a obiectului folosind pentru în Buclă

Prin utilizarea pentru in, putem buclei peste fiecare proprietate într-un obiect. În exemplul următor, folosim pentru in pentru a prelua numele proprietăților din obiectul cody.

Mostră: sample44.html

 

pentru in buclă are un dezavantaj. Acesta nu numai că va accesa proprietățile obiectului specific care este bucle. De asemenea, va include în buclă toate proprietățile moștenite (prin lanțul prototip) de obiect. Astfel, dacă acest lucru nu este rezultatul dorit și, de cele mai multe ori, nu este, trebuie să folosim un simplu dacă declarația din interiorul bucla pentru a ne asigura că accesăm numai proprietățile conținute în obiectul specific pe care îl încurcăm. Acest lucru se poate face folosind hasOwnProperty () metoda moștenită de toate obiectele.

Ordinea în care proprietățile sunt accesate în bucla nu este întotdeauna ordinea în care acestea sunt definite în bucla. În plus, ordinea în care ați definit proprietățile nu este neapărat ordinea în care acestea sunt accesate.

Numai proprietățile care sunt enumerabile (adică disponibile atunci când se loopesc peste proprietățile obiectelor) apar cu pentru in buclă. De exemplu, proprietatea constructorului nu va apărea. Este posibil să verificați care sunt proprietățile enumerabile cu propertyIsEnumerable () metodă.


Obiectele gazdă și obiectele native

Trebuie să știți că mediul (de exemplu, un browser web) în care este executat JavaScript conține, de obicei, ceea ce se numește obiecte gazdă. Obiectele gazdă nu fac parte din implementarea ECMAScript, dar sunt disponibile ca obiecte în timpul execuției. Desigur, disponibilitatea și comportamentul unui obiect gazdă depinde complet de ceea ce oferă mediul gazdă.

De exemplu, în mediul de navigare web, obiectul fereastră / cap și toate obiectele care le conțin (cu excepția a ceea ce oferă JavaScript) sunt considerate obiecte gazdă.

În următorul exemplu, examinez proprietățile fereastră obiect.

Mostră: sample45.html

 

S-ar putea să fi observat că obiectele JavaScript native nu sunt listate printre obiectele gazdă. Este destul de comun ca un browser să facă distincția între obiectele gazdă și obiectele native.

În ceea ce privește browserele web, cel mai faimos dintre obiectele găzduite este interfața pentru lucrul cu documente HTML, cunoscută și sub numele de DOM. Următorul exemplu este o metodă pentru a lista toate obiectele conținute în interiorul window.document obiect furnizat de mediul browserului.

Mostră: sample46.html

 

Ceea ce vreau să învățați aici este că specificația JavaScript nu se referă la obiectele gazdă și invers. Există o linie de divizare între ceea ce oferă JavaScript (de exemplu, JavaScript 1.5, ECMA-262, Ediția 3 versus JavaScript 1.6, 1.7, 1.8, 1.8.1, 1.8.5) și ceea ce oferă mediul gazdă. fi confuz.

Mediul gazdă (de exemplu, un browser web) care execută codul JavaScript furnizează de obicei obiectul cap (de exemplu, obiectul ferestrei într-un browser web) unde porțiunile native ale limbii sunt stocate împreună cu obiectele gazdă (de ex.., window.location într-un browser web) și obiecte definite de utilizator (de exemplu, codul pe care îl scrieți pentru a fi rulat în browserul web).

Uneori, un producător de browser web, ca gazdă a interpretului JavaScript, va împinge înainte o versiune de JavaScript sau va adăuga JavaScript înaintea ca acestea să fie aprobate (de ex. Mozilla Firefox JavaScript 1.6, 1.7, 1.8, 1.8.1, 1.8. 5).


Îmbunătățirea și extinderea obiectelor cu Underscore.js

JavaScript 1.5 este lipsit atunci când vine vorba de manipularea și gestionarea obiectelor în mod serios. Dacă rulați JavaScript într-un browser web, aș dori să fiu îndrăzneț aici și sugerăm utilizarea Underscore.js atunci când aveți nevoie de mai multă funcționalitate decât cea oferită de JavaScript 1.5. Underscore.js oferă următoarea funcționalitate atunci când se ocupă cu obiecte.

Aceste funcții funcționează pe toate obiectele și matricele:

  • fiecare()
  • Hartă()
  • reduce()
  • reduceRight ()
  • detecta()
  • Selectați()
  • respinge()
  • toate()
  • orice()
  • include()
  • invoca()
  • smulge ()
  • max ()
  • min ()
  • filtrează după()
  • sortIndex ()
  • toArray ()
  • mărimea()

Aceste funcții funcționează pe toate obiectele:

  • chei ()
  • valori ()
  • funcții ()
  • extinde()
  • clona ()
  • Atingeți()
  • este egal()
  • este gol()
  • isElement ()
  • isArray ()
  • isArguments
  • isFunction ()
  • isString ()
  • ISNUMBER
  • isBoolean
  • isDate
  • isRegExp
  • isNaN
  • isnull
  • isUndefined

Concluzie

Îmi place această bibliotecă deoarece profită de noile adăugiri native la JavaScript, în cazul în care browserele le suportă, dar oferă, de asemenea, aceleași funcționalități browserelor care nu, toate fără a schimba implementarea nativă a JavaScript decât dacă trebuie.

Înainte de a începe să utilizați Underscore.js, asigurați-vă că funcția de care aveți nevoie nu este deja furnizată de o bibliotecă sau de un cadru JavaScript care ar putea fi deja utilizat în codul dvs..

Cod