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.
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.
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.
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.
ș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.
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.
hasOwnProperty
pentru a verifica dacă o proprietate a obiectului nu este din lanțul prototipIn 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.
î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.
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ă.
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).
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
Î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..