Cum sunt create obiectele în js. Programare orientată pe obiecte. Folosind funcția constructor
Obiecte JavaScript
În precedent Lecții de JavaScript Ați văzut că există mai multe obiecte încorporate, cum ar fi String, Date, Array și altele. Pe lângă aceste obiecte încorporate, vă puteți crea și propriile obiecte.
Obiectul este tip special date cu un set de proprietăți și metode.
Să ilustrăm acest lucru cu un exemplu: Persoana este un obiect. Proprietățile sunt valori asociate unui obiect. Proprietățile persoanei includ numele, înălțimea, greutatea, vârsta, culoarea pielii, culoarea ochilor etc. Toate persoanele au aceste proprietăți, dar valorile acestor proprietăți vor diferi de la o persoană la alta. Obiectele au și metode. Metodele sunt acțiuni care pot fi efectuate asupra obiectelor. Metodele de persoană pot include eat(), sleep(), work(), play(), etc.
Proprietăți
Sintaxa pentru accesarea proprietății unui obiect este:
Codul de mai sus va genera următoarea ieșire:
Cometariu: Parametrii trecuți metodei sunt încadrați în acolade.
Un exemplu de apelare a metodei sleep() a obiectului personObj:
sintaxă alternativă (folosind literale obiect):
2. Creați un constructor de obiecte
Creăm o funcție care inițializează obiecte:
persoană cu funcție (prenume, prenume, vârstă, culoarea ochilor) { this.firstname=prenume; this.lastname=nume; this.age=varsta; this.eyeculo=culoarea ochilor; } |
În interiorul funcției, trebuie să atribuiți valori proprietăților folosind constructul this.PropertyName. Motivul pentru această sintaxă este că veți folosi mai mult de o instanță a unui obiect (persoană) la un moment dat (și trebuie să fie clar cu ce obiect specific aveți de-a face). Prin urmare, cuvântul „acest” indică un obiect specific - curent ale cărui proprietăți le inițializați în constructor.
Odată ce ați scris constructorul unui obiect, puteți crea instanțe noi ale obiectului, astfel:
Rețineți că metodele sunt doar funcții obișnuite atașate obiectelor. În continuare trebuie să scriem corpul funcției newlastname().
Obiectele sunt piatra de temelie a JavaScript. Multe tipuri de date încorporate sunt reprezentate ca obiecte. Pentru a fi un dezvoltator JavaScript de succes, trebuie să înțelegeți clar modul în care funcționează. Blocurile de construcție ale unui obiect se numesc câmpurile sale sau proprietățile obiectului JavaScript. Sunt folosite pentru a descrie orice aspect al unui obiect. Proprietatea ar putea descrie lungimea unei liste, culoarea cerului sau data nașterii unei persoane. Crearea obiectelor este un proces ușor. Limbajul oferă o sintaxă cunoscută sub numele de literale obiect, care sunt notate cu acolade.
Accesarea Proprietăților
Limba oferă două intrări pentru accesarea proprietăților. Prima și cea mai comună este cunoscută sub numele de notație punct. În notație cu puncte, o resursă poate fi accesată specificând numele obiectului gazdă, urmat de punct și numele proprietății. De exemplu, când object.foo a fost setat inițial la unu, atunci valoarea sa va deveni 2 după ce instrucțiunea JavaScript objects este executată.
O sintaxă alternativă de acces este cunoscută sub numele de notație paranteze. În notație, numele obiectului este urmat de un set de paranteze drepte. În ele, numele proprietății este specificat ca șir:
obiect["foo"] = obiect["foo"] + 1.
Este mai expresiv decât notația cu puncte, deoarece permite unei variabile să specifice întregul sau parțial numele unei proprietăți. Acest lucru este posibil deoarece interpretul de obiect JavaScript convertește automat această expresie într-un șir și apoi obține proprietatea corespunzătoare. Numele proprietăților sunt create din mers prin concatenarea conținutului variabilei f cu șirul „oo”:
obiect = „bară”.
Notarea cu paranteze permite numelor de proprietăți să conțină caractere care sunt interzise în notația cu puncte. De exemplu, următoarea afirmație este complet legală între paranteze. Cu toate acestea, dacă utilizatorul încearcă să creeze același nume de proprietate în notație cu puncte, va întâlni o eroare de sintaxă:
obiect["!@#$% &*()."] = adevărat.
Proprietățile obiectelor JavaScript imbricate pot fi accesate prin înlănțuirea de puncte și/sau paranteze. De exemplu, următorul obiect conține un obiect imbricat numit baz care conține un alt obiect numit foo care are o proprietate numită bar care conține valoarea cinci:
var obiect = ( baz: ( foo: ( bar: 5 ) ) ).
Următoarele expresii accesează proprietatea atașată barei. Prima expresie folosește notația punct, în timp ce a doua expresie folosește notația pătrată. A treia expresie combină ambele intrări pentru a obține același rezultat:
- obiect.baz.foo.bar;
- obiect["baz"]["foo"]["bar"];
- obiect["baz"].foo["bar"].
Expresii precum cele prezentate în exemplul anterior pot cauza degradarea performanței dacă sunt utilizate incorect și pot duce la eșecul obiectului JavaScript. Evaluarea fiecărei expresii punct sau paranteză necesită timp. Dacă aceeași proprietate este folosită de mai multe ori, atunci este logic să accesați proprietatea o dată și apoi să stocați valoarea într-o variabilă locală pentru toate utilizările viitoare.
Funcționează ca metodă
Când o funcție este folosită ca proprietate a unui obiect, se numește metodă. La fel ca și proprietățile, ele sunt specificate în notația literală a obiectului. De exemplu:
var obiect = ( suma: function(foo, bar) ( return foo + bar; ) ).
Metodele obiectelor JavaScript pot fi apelate folosind semne și paranteze. Următorul exemplu apelează metoda sum() din exemplul anterior folosind ambele intrări:
- obiect.sumă(1, 2);
- obiect[„sumă”](1, 2).
Notația literală a obiectelor este utilă pentru crearea de noi obiecte, dar nu poate adăuga proprietăți sau metode celor existente. Din fericire, adăugarea de date noi este la fel de ușoară ca și crearea unei declarații de atribuire. Este creat un obiect gol. Apoi, folosind operatori de atribuire, adăugăm două proprietăți, foo și bar, și metoda baz:
- var obiect = ();
- obiect.foo = 1;
- obiect.bar = nul;
- object.baz = function() ( returnează „bună ziua de la baz()”; ).
Încapsularea programului
Ideea de bază a programării orientate pe obiect este de a împărți programele în părți mai mici și de a face fiecare parte responsabilă pentru gestionarea propriei stări. Astfel, unele cunoștințe despre cum funcționează o parte a unui program pot fi locale acelei părți. Cineva care lucrează la restul programului nu ar trebui să-și amintească sau chiar să știe despre el. Ori de câte ori aceste date locale se modifică, trebuie actualizat doar codul imediat din jurul lor.
Diferitele părți ale unui astfel de program interacționează între ele prin interfețe, seturi limitate funcții sau legături care oferă funcționalitate utilă la un nivel mai abstract în timp ce ascund implementarea lor exactă. Astfel de părți ale unui program sunt modelate folosind obiecte. Interfața lor constă din un anumit set metode si proprietati. Proprietățile care fac parte dintr-o interfață sunt numite publice. Restul, care nu ar trebui să atingă codul extern, se numesc private.
Multe limbi oferă posibilitatea de a distinge între proprietățile publice și private și nu permit codului extern să acceseze cele private. JavaScript, care adoptă din nou o abordare minimalistă, nu există încă. În prezent se lucrează pentru adăugarea acestei limbi. Prin urmare, programatorii JavaScript vor folosi cu succes această idee. De obicei, interfața disponibilă este descrisă în documentație sau comentarii. De asemenea, este o practică obișnuită să plasați o liniuță de subliniere (_) la începutul numelor de proprietate pentru a indica faptul că acele proprietăți sunt private. Separarea interfeței de implementare este o idee grozavă. Aceasta se numește de obicei încapsulare.
Proprietăți
Un obiect cu paranteze (...) se numește un obiect literal. Puteți plasa imediat unele proprietăți între astfel de paranteze (...). De exemplu, perechi „cheie: valoare și așa mai departe”:
permite utilizatorului = ( // un nume de obiect: „Ioan”, // prin cheie „nume” să stocheze valoarea „ Ioan" age: 30 // by key "age" store value 30 }.!}
O proprietate are o cheie (cunoscută și ca „nume” sau „identificator”) înainte de două puncte „:” și o valoare în dreapta acesteia. Obiectul utilizator are două proprietăți. Obiectul JavaScript utilizator rezultat cu două fișiere semnate etichetate „nume” și „vârstă”. Puteți adăuga, șterge și citi fișiere din acesta în orice moment. Valorile proprietăților sunt accesate folosind notația cu puncte. Poate fi de orice tip. Puteți adăuga o valoare booleană. Pentru a elimina o proprietate, utilizați ștergere în cazul de eroare al unui obiect JavaScript.
Toate obiectele de eroare JavaScript sunt descendenți ai obiectului Error sau ai unui obiect moștenit:
- Obiectul Error de sintaxă moștenește de la obiectul Error.
- Eroare de analiză JSON a unui anumit tip de obiect Eroare de sintaxă.
Pentru a înțelege și mai profund modul în care aplicațiile tratează erorile JavaScript, aruncați o privire mai atentă la Airbrake JavaScript, un instrument de urmărire a erorilor pentru alerte în timp real și o perspectivă instantanee asupra a ceea ce a mers prost cu codul dvs. JavaScript.
Mesaje de eroare pe care un utilizator le poate primi înainte de a șterge un obiect JavaScript:
- Caracter de control greșit într-un șir literal.
- Caracter greșit într-un șir literal.
- Ieșire Unicode slabă.
- Personaj de evadare prost.
- Șir neterminat.
- Cod nenumeric neașteptat.
- Nu există numere după virgulă.
- Număr fracționar neterminat.
- Nu există numere după indicatorul de grad.
- Nu există numere după semnul exponentului.
- Partea exponențială nu are număr.
- Sfârșitul neașteptat al datelor.
- Cuvânt cheie neașteptat.
- Un simbol neașteptat.
- Sfârșitul datelor la citirea conținutului unui obiect.
- Numele de proprietate așteptat sau „)”.
Proprietăți de calcul
Puteți utiliza paranteze drepte într-un obiect literal. Acestea se numesc proprietăți calculate. Un exemplu este dat mai jos.
Sensul unei proprietăți calculate este simplu: înseamnă că numele proprietății trebuie luat din fructe. Deci, dacă un vizitator introduce „măr”, punga va deveni (măr: 5). Puteți folosi expresii mai complexe între paranteze drepte:
lasă fructe = „măr”;
: 5 // bag.appleComputers = 5
Parantezele pătrate sunt mult mai puternice decât notația cu puncte. Acestea permit nume de proprietăți și variabile. Dar sunt și mai greoi de scris. Deci, de cele mai multe ori, când numele proprietăților sunt cunoscute și simple, se folosește un punct. Și dacă aveți nevoie de ceva mai complex, atunci treceți la paranteze drepte.
Rezervarea cuvintelor
O variabilă nu poate avea un nume egal cu unul dintre cuvintele rezervate, cum ar fi „pentru”, „lasă”, „întoarce”, etc. Dar atunci când sortați obiecte JavaScript, nu există o astfel de restricție.
În principiu, orice nume este permis, dar există unul special: „__proto__” primește un tratament special din motive istorice. De exemplu, nu îl puteți seta la o altă valoare decât un obiect:
obj.__proto__ = 5;
alert(obj.__proto__); // nu a funcționat conform intenției
După cum puteți vedea din cod, scopul primitivei 5 este ignorat. Aceasta poate fi o sursă de erori și chiar vulnerabilități dacă operatorul intenționează să stocheze perechi cheie-valoare arbitrare într-un obiect și să permită vizitatorului să specifice cheile. În acest caz, vizitatorul poate selecta „proto” ca cheie și poate adăuga JavaScript la obiect. Există o modalitate de a face obiecte tratate cu __proto__ ca o proprietate obișnuită. Există, de asemenea, o altă hartă a structurilor de date care acceptă chei arbitrare.
Proprietăți întregi
Termenul „proprietate întreg” înseamnă aici un șir care poate fi convertit dintr-un număr întreg fără modificare. Deci, de exemplu, „49” este un nume de proprietate întreg, deoarece atunci când este convertit într-un număr întreg și înapoi, este în continuare același. Dar „+49” și „1,2” nu sunt așa. Pe de altă parte, dacă cheile nu sunt întregi, atunci ele sunt listate în ordinea în care au fost create. Exemplu de mai jos.
Pentru a remedia problema cu codurile de apelare, puteți „trișa” făcând codurile incomplete. Adăugarea unui „+” (semnul plus) înainte de fiecare cod este suficientă. Acum va funcționa conform intenției.
Diferența dintre obiecte și primitive este că acestea sunt stocate și copiate „prin referință”. Valorile primitive sunt atribuite și copiate „ca valoare întreagă”. O variabilă stochează o „adresă în memorie” mai degrabă decât obiectul în sine sau o „referință” la acesta. Puteți utiliza orice variabilă pentru a accesa și modifica conținutul acesteia.
Exemplul de mai sus arată că există un singur obiect și un administrator care să se conecteze la el. Apoi, dacă o cheie diferită (utilizator) este folosită ulterior, utilizatorul va observa modificările.
Operatorii de egalitate == și egalitatea strictă === pentru obiecte funcționează în același mod. Două obiecte sunt egale numai dacă sunt același obiect. Pentru comparații precum obj1 > obj2 sau comparații cu primitivul obj == 5, obiectele sunt convertite în primitive. Sincer să fiu, astfel de comparații sunt foarte rar necesare și sunt de obicei rezultatul unei erori de codare.
Validare obiect JavaScript
Obiectele au acces la orice proprietate. Totuși, dacă nu există deloc, nu va fi o eroare. Doar accesarea unei proprietăți inexistente returnează nedefinit. Oferă o modalitate foarte comună de a testa o proprietate și de a o compara cu una nedefinită. Mai jos este un exemplu.
Folosind „în” pentru proprietățile care stochează nedefinit. De obicei, o verificare strictă de comparație „=== nedefinit” funcționează bine. Mânca un caz special când eșuează și „în” funcționează corect. Acesta este momentul în care o proprietate a unui obiect există, dar rămâne nedefinită.
În codul de mai sus, proprietatea obj.test există din punct de vedere tehnic. Prin urmare, operatorul de intrare funcționează corect. Situații similare se întâmplă foarte rar deoarece undefined nu este de obicei atribuit. În cea mai mare parte, sunt utilizate valori „necunoscute” sau „vide” nule. Astfel, operatorul in este efectiv un invitat în cod.
buclă „for..in”.
Pentru a trece prin toate tastele de la obiect la obiect, există o formă specială de buclă: for..in. Acesta este un lucru complet diferit de constructul for(;;).
Mai jos este un exemplu.
Vă rugăm să rețineți că toți constructorii „for” vă permit să declarați o variabilă de buclă în interiorul unei bucle ca o cheie let. Alternativ, puteți utiliza un alt nume de variabilă, cheie.
De exemplu, for(let prop in obj) este, de asemenea, utilizat pe scară largă.
Există o alternativă „paranteză pătrată” care funcționează cu orice șir.
Ideea aici necesită ca cheile obiectului JavaScript să fie un identificator de variabilă valid, ceea ce înseamnă că nu există spații sau alte restricții. Trebuie avut grijă să vă asigurați că linia din interiorul parantezelor este citată corect. Parantezele pătrate oferă, de asemenea, o modalitate de a obține numele proprietății din rezultatul oricărei expresii, spre deosebire de un șir literal dintr-o variabilă:
let key = „îi plac păsările”;
// la fel ca user["like birds"] = true;
utilizator = adevărat.
Aici variabila cheie poate fi calculată în timpul execuției și depinde de intrarea utilizatorului și apoi utilizată pentru a accesa proprietatea. Acest lucru oferă programatorilor mai multă flexibilitate. Notația cu puncte nu poate fi utilizată într-un mod similar, deoarece ar repeta peste obiectul JavaScript. Mai jos este un exemplu.
Const obiect
Un obiect const declarat poate fi modificat. Un exemplu este dat mai jos.
Ar putea părea că obiectul JavaScript din linia (*) ar arunca o eroare, dar nu este cazul. Acest lucru se datorează faptului că const captează valoarea utilizatorului însuși. Și aici utilizatorul păstrează o referință la același obiect tot timpul. Linia (*) intră în interiorul obiectului, nu este reatribuită utilizatorului. Const va da o eroare dacă încercați să setați utilizatorul și altceva. Clonarea și fuzionarea, Object.assign creează o altă referință la același obiect dacă trebuie duplicat. Acest lucru este, de asemenea, realizabil, dar puțin mai dificil, deoarece JavaScript nu are o metodă încorporată. De fapt, acest lucru este rareori necesar. Copierea prin referință este utilizată în majoritatea cazurilor. Dar dacă chiar aveți nevoie de acest lucru, atunci trebuie să creați un obiect JavaScript și să replicați structura unuia existent, copierea proprietăților acestuia la un nivel primitiv. Mai jos este un exemplu.
Și puteți folosi și metoda Object.assign pentru aceasta. Argumentele dest și src1, ..., srcN sunt obiecte. Copiază proprietățile tuturor obiectelor src1, ..., srcNINTO dest. Cu alte cuvinte, proprietățile tuturor argumentelor, începând de la al doilea, sunt copiate în primul. Apoi se întoarce în dest. De exemplu, îl puteți folosi pentru a combina mai multe obiecte într-unul singur.
Și puteți utiliza, de asemenea, Object.assign pentru a înlocui bucla simplă de clonare. Copiază toate proprietățile utilizatorului într-un obiect gol și îl returnează, la fel ca o buclă, dar mai scurtă. Până acum, s-a presupus că toate proprietățile utilizatorului sunt primitive. Dar proprietățile pot fi referințe la alte obiecte.
Pentru a remedia acest lucru, trebuie să utilizați o buclă de clonare care verifică fiecare valoare de utilizator și, dacă este un obiect, apoi îi reproduce structura. Aceasta se numește „clonare profundă”.
Există un algoritm standard de clonare profundă care se ocupă de cazul de mai sus și de cazuri mai complexe numite algoritm de clonare structurată. Pentru a evita reinventarea roții, puteți folosi o implementare funcțională din biblioteca JavaScript lodash, metoda se numește _.cloneDeep(obj).
Metode avansate
Dacă un programator trece peste un obiect și dorește să obțină toate proprietățile în aceeași ordine în care au fost adăugate, el se poate baza pe „ordonare specială”, în care proprietățile întregi sunt sortate și altele sunt formate în ordinea în care a fost creat obiectul JavaScript. .
Metodele avansate de obiecte se ocupă de concepte care sunt rareori utilizate în JavaScript. Acest lucru se datorează faptului că, în scenariile normale, aceste caracteristici puternice nu sunt necesare. Este posibil ca unele dintre aceste metode să nu funcționeze în browserele mai vechi, cum ar fi versiunile timpurii ale Netscape 4.
Prototipul ar putea fi folosit pentru a crea obiecte JavaScript și toate metodele mycircle, nu doar pe cele noi. Acest lucru are un impact mixt asupra performanței. Nu trebuie să stocheze copii separate ale metodelor pentru fiecare instanță de obiect, așa că ar putea necesita mai puțină memorie pentru a funcționa, dar browserul trebuie să caute domeniile actuale și părinte pentru a le găsi. Acest lucru poate duce la o latență extremă. În general, utilizatorul ar trebui să folosească ceea ce este adecvat pentru cod, mai degrabă decât să bazeze acea decizie pe performanță, cu excepția cazului în care are de-a face cu un mediu controlat foarte specific.
Returnează adevărat
În unele cazuri, poate fi necesar ca proprietatea unui obiect să fie legată de obiectul în sine sau de undeva în lanțul de prototipuri. În JavaScript, toate obiectele folosesc metoda hasOwnProperty, care returnează adevărat dacă acea proprietate este legată de o instanță a unui obiect individual. În acest caz, devine posibil să se verifice dacă constructorul unui obiect are aceeași proprietate cu aceeași valoare ca și instanța obiectului în sine. Acest lucru poate da rezultate incorecte dacă există proprietăți separate ale obiectului JavaScript cu aceeași valoare atât pentru instanța obiectului, cât și pentru prototipul circuitului. Metoda hasOwnProperty ia un singur parametru - numele proprietății ca șir.
Puteți crea metode private într-un mod similar. Este pur și simplu o funcție care este creată în interiorul unei funcții de constructor. Acest lucru poate părea confuz pentru unii, dar așa funcționează. O funcție privată poate fi apelată doar de către constructorul însuși sau prin metode care sunt definite pe linie. Ele pot fi folosite ca metode publice dacă sunt atribuite unui constructor public și accesate folosind metode publice ale obiectelor Javascript.
function myob() ( function cantBeSeen() ( alert(secretValue);
) var secretValue = "";
this.method1 = function () ( secretValue = " fara surprize";!}
this.method2 = cantBeSeen;
) var oneOb = new myob();
oneOb.method1();
//alertează „fără surprize” oneOb.method2();
//avertizează „fără surprize”.
Șablon de comandă
Obiectele de comandă permit sistemele slab cuplate prin separarea celor care emit o solicitare de obiecte și a celor care procesează efectiv cererea. Aceste cereri se numesc evenimente, iar codul care procesează cererile se numește handler de evenimente.
Să presupunem că creați aplicații care acceptă acțiunile din clipboard Cut, Copy and Paste. Aceste acțiuni pot fi declanșate în diferite moduri de-a lungul aplicației: prin sistemul de meniu, prin meniul contextual, de exemplu făcând clic dreapta pe câmp de text sau o comandă rapidă de la tastatură. Obiectele de comandă vă permit să centralizați procesarea acestor acțiuni, câte una pentru fiecare operație, când este necesară o singură comandă pentru a procesa toate cererile Cut, una pentru toate cererile Copy și una pentru toate cererile Paste.
Deoarece echipele centralizează toată procesarea, ele sunt adesea implicate în gestionarea funcțiilor de anulare pentru întreaga aplicație. Îmbunătățiri semnificative pot fi obținute prin utilizarea metode moderne JavaScript, rezultând aplicații mai eficiente, mai fiabile și mai ușor de întreținut.
Pentru a afla cum să faceți acest lucru, puteți utiliza șabloane JavaScript + jQuery. Acest pachet unic include JavaScript optimizat pentru toate șabloanele GoF folosind funcții mai avansate, cum ar fi spații de nume, prototipuri, module, obiecte funcționale, închideri, funcții anonime și multe altele. Dacă utilizatorii au nevoie de cele mai recente instrumente și tehnici pentru șabloanele JavaScript, șabloanele jQuery și arhitecturile de șabloane, atunci acesta este cel mai bun caz de utilizare. Acest pachet conține informații valoroase și actualizate pentru dezvoltatorii JavaScript. Iată ce este inclus:
- Șabloane GoF optimizate pentru JavaScript.
- Modele moderne de design JavaScript.
- Model-View Design Patterns.
- Șabloane de design jQuery.
- Modele arhitecturale ale idiomurilor JavaScript.
- Exemple de aplicații (MVC, SPA etc.)
Elementele de bază propuse pentru sintaxa obiectelor JavaScript sunt foarte importante pentru programatorii începători. Mai întâi trebuie să înțelegem obiectele, apoi vor exista cunoștințe despre programarea orientată pe obiecte. Este esențial să aveți o înțelegere profundă a acestui material, deoarece servește drept bază pentru restul limbajului JavaScript.
JavaScript este conceput pe baza unei paradigme simple. Conceptul se bazează pe obiecte simple. Un obiect este o colecție de proprietăți, iar fiecare proprietate constă dintr-un nume și o valoare asociate cu acel nume. Valoarea proprietății poate fi o funcție, care poate fi apelată metodă obiect. Pe lângă obiectele încorporate în browser, vă puteți defini propriile obiecte. Acest capitol descrie cum să utilizați obiecte, proprietăți, funcții și metode și cum să vă creați propriile obiecte.
Privire de ansamblu asupra obiectelor
Obiectele din JavaScript, ca și în multe alte limbaje de programare, sunt similare cu obiectele viata reala. Conceptul de obiecte JavaScript este mai ușor de înțeles prin realizarea de paralele cu obiectele din viața reală.
În JavaScript, un obiect este o unitate independentă care are proprietăți și un anumit tip. Să comparăm, de exemplu, cu o cană. O ceașcă are culoare, formă, greutate, material din care este făcută etc. La fel, obiectele JavaScript au proprietăți care le definesc caracteristicile.
Obiecte și proprietăți
În JavaScript, un obiect are proprietăți asociate cu el. O proprietate de obiect poate fi înțeleasă ca o variabilă atribuită unui obiect. Proprietățile obiectului sunt în esență aceleași cu variabilele JavaScript, cu excepția faptului că sunt atribuite obiectului. Proprietățile unui obiect determină caracteristicile acestuia. Puteți accesa o proprietate a unui obiect folosind notația cu puncte:
ObjectName.propertyName
La fel ca toate variabilele JavaScript, numele obiectului (care poate fi și o variabilă) și numele proprietății sunt sensibile la majuscule și minuscule. Puteți defini o proprietate specificând valoarea acesteia. De exemplu, să creăm un obiect myCar și să definim proprietățile marca, modelul și anul, după cum urmează:
Var myCar = obiect nou(); myCar.make = „Ford”; myCar.model = „Mustang”; myCar.year = 1969;
Proprietățile obiectelor nedefinite sunt nedefinite (nu nule).
Mașina mea. culoare; // nedefinit
Proprietățile obiectelor JavaScript pot fi, de asemenea, accesate sau setate folosind notația paranteze (a se vedea pentru mai multe detalii). Obiectele sunt uneori numite tablouri asociative, deoarece fiecare proprietate este asociată cu o valoare șir care poate fi folosită pentru a o accesa. Deci, de exemplu, puteți accesa proprietățile obiectului myCar astfel:
MyCar["make"] = "Ford"; myCar["model"] = "Mustang"; myCar["anul"] = 1969;
Numele proprietăților obiectelor pot fi șiruri JavaScript sau orice poate fi convertit într-un șir, inclusiv șirul gol. Cu toate acestea, orice nume de proprietate care conține un identificator JavaScript nevalid (de exemplu, un nume de proprietate care conține un spațiu și o liniuță sau care începe cu un număr) poate fi accesat folosind paranteze drepte. Această notație este utilă și atunci când numele proprietăților trebuie să fie determinate dinamic (când numele proprietății nu este determinat până la runtime). Exemple de mai jos:
Var myObj = new Object(), str = "myString", rand = Math.random(), obj = new Object(); myObj.type = "Sintaxa punctului"; myObj["date created"] = "Șir cu spațiu"; myObj = „Valoare șir”; myObj = „Număr aleatoriu”; myObj = „Obiect”; myObj[""] = "Chiar și un șir gol"; console.log(myObj);
Rețineți că toate cheile cu paranteze drepte sunt convertite într-un tip String, deoarece obiectele din JavaScript pot avea doar un tip String ca cheie. De exemplu, în codul de mai sus, când cheia obj este adăugată la myObj , JavaScript apelează metoda obj.toString() și folosește acel șir rezultat ca nouă cheie.
De asemenea, puteți accesa proprietăți folosind o valoare șir care este stocată într-o variabilă:
Var propertyName = "facă"; myCar = "Ford"; propertyName = "model"; myCar = „Mustang”;
Puteți folosi paranteze pătrate într-o clauză for...in pentru a itera toate proprietățile unui obiect pentru care este permis. Pentru a arăta cum funcționează, următoarea funcție arată toate proprietățile unui obiect atunci când treceți obiectul în sine și numele acestuia ca argumente funcției:
Funcția showProps(obj, objName) ( var rezultat = ""; pentru (var i în obj) ( if (obj.hasOwnProperty(i)) (rezultat += objName + "." + i + " = " + obj[i ] + „\n”; ) ) returnează rezultatul; )
Deci, dacă numim această funcție astfel showProps(myCar, "myCar"), vom obține rezultatul:
MyCar.make = Ford myCar.model = Mustang myCar.year = 1969
Listarea tuturor proprietăților unui obiect
Folosind funcția constructor
O altă modalitate de a crea un obiect în doi pași este descrisă mai jos:
- Determinați tipul unui obiect scriind o funcție de constructor. Numele unei astfel de funcții începe de obicei cu o literă mare.
- Creați o instanță a unui obiect folosind cuvântul cheie nou.
Pentru a determina tipul unui obiect, creați o funcție care determină tipul obiectului, numele, proprietățile și metodele acestuia. De exemplu, să presupunem că doriți să creați un tip de obiect pentru a descrie mașinile. Doriți ca un obiect de acest tip să se numească mașină și doriți să aibă proprietățile marca, modelul și anul. Pentru a face acest lucru, scrieți următoarea funcție:
Funcția Mașină (marcă, model, an) ( this.make = make; this.model = model; this.year = year; )
Rețineți că aceasta este folosită pentru a atribui valori (transmise ca argumente de funcție) proprietăților unui obiect.
Acum puteți crea un obiect numit mycar astfel:
Var mycar = masina noua("Eagle", "Talon TSi", 1993);
Această declarație creează un obiect de tip Car cu referință mycar și atribuie anumite valori proprietățile sale. Valoarea mycar.make va fi șirul „Eagle”, mycar.year va fi numărul întreg 1993 și așa mai departe.
Puteți crea câte obiecte mașină aveți nevoie, apelând pur și simplu nou. De exemplu:
Var kenscar = mașină nouă ("Nissan", "300ZX", 1992); var vpgscar = masina noua("Mazda", "Miata", 1990);
Un obiect poate avea o proprietate care va fi un alt obiect. De exemplu, următoarele definește un obiect de tip Persoană după cum urmează:
Funcție Persoană (nume, vârstă, sex) ( this.name = nume; this.age = vârstă; this.sex = sex; )
și apoi creați două noi instanțe de obiect Person, după cum urmează:
Var rand = new Person("Rand McKinnon", 33, "M"); var ken = new Person("Ken Jones", 39, "M");
Apoi, puteți rescrie definiția mașinii pentru a include o proprietate a proprietarului, căruia i se atribuie un obiect persoană, astfel:
Funcția Mașină (marcă, model, an, proprietar) ( this.make = make; this.model = model; this.year = year; this.owner = proprietar; )
Apoi, pentru a instanția noile obiecte, urmați aceste instrucțiuni:
Var car1 = new Car("Vultur", "Talon TSi", 1993, rand); var car2 = new Car("Nissan", "300ZX", 1992, ken);
Rețineți că, în loc să transmiteți un șir, un literal sau un întreg atunci când creați obiecte noi, expresiile de mai sus transmit obiecte rand și ken ca argumente pentru funcție. Acum, dacă trebuie să aflați numele proprietarului car2, puteți face acest lucru:
Car2.proprietar
Rețineți că oricând puteți adăuga o nouă proprietate unui obiect creat anterior. De exemplu, expresia
Car1.color = „negru”;
adaugă o proprietate de culoare la car1 și își setează valoarea la „negru”. Cu toate acestea, acest lucru nu afectează niciun alt obiect. Pentru a adăuga o nouă proprietate la toate obiectele de același tip, trebuie să adăugați proprietatea la definiția tipului obiectului mașină.
Folosind metoda Object.create
Obiectele pot fi create și folosind metoda Object.create. Această metodă este foarte convenabilă deoarece vă permite să specificați un obiect prototip pentru un nou obiect al dvs. fără a defini o funcție de constructor.
// lista de proprietăți și metode pentru Animal var Animal = ( tip: "Nevertebrate", // Valoarea implicită de tip displayType: function() ( // Metodă de afișare a tipului obiectului Animal console.log(this.type); )); // Creați un obiect Animal var animal1 = Object.create(Animal); animal1.displayType(); // Ieșiri: Nevertebrate // Creați un obiect Animal și atribuiți-i tip = Fishes var fish = Object.create(Animal); fish.type = „Pești”; fish.displayType(); // Ieșiri: Pești
Moştenire
Toate obiectele din JavaScript moștenesc de la cel puțin alt obiect. Obiectul de la care a avut loc moștenirea se numește prototip, iar proprietățile moștenite pot fi găsite în obiectul prototip al constructorului.
Indici de proprietate a obiectelor
În JavaScript 1.0, vă puteți referi la proprietățile unui obiect fie prin numele său, fie prin indexul său ordinal. În JavaScript 1.1 și versiunile ulterioare, dacă ați definit inițial o proprietate după nume, trebuie întotdeauna să vă referiți la ea prin numele ei, iar dacă ați definit inițial o proprietate după index, trebuie să vă referiți la ea prin indexul său.
Această limitare este impusă atunci când creați un obiect și proprietățile acestuia folosind funcția de constructor (cum am făcut mai devreme cu tipul Mașină) și când definiți proprietățile individuale în mod explicit (de exemplu, myCar.color="red"). Dacă ați definit inițial o proprietate a unui obiect printr-un index, de exemplu myCar = "25 mpg" , atunci vă puteți referi ulterior la această proprietate numai ca myCar .
Excepția de la regulă o reprezintă obiectele redate din HTML, cum ar fi matricea de formulare. Vă puteți referi oricând la obiectele din aceste matrice, fie folosind indexul lor (care se bazează pe ordinea în care apar document HTML), sau după numele lor (dacă acestea au fost identificate). De exemplu, dacă a doua etichetă html