Javascript, Clase

În mod obișnuit, instanțele clasei necesită inițializare suplimentară, deci este definită o funcție care creează și inițializează obiecte noi. Următorul exemplu demonstrează această funcție: definește un obiect prototip reprezentând o gamă de valori, precum și o funcție "din fabrică" care creează și inițiază noi instanțe ale clasei:







În acest exemplu, există câteva puncte interesante care trebuie notate în mod special. Aceasta definește intervalul de funcții din fabrică (), care este utilizat pentru a crea noi obiecte de gama.

Rețineți că funcția range () definește proprietățile de la și la proprietățile fiecărui obiect din interval. Aceste proprietăți ne-împărtășite, ne-moștenite definesc informații unice pentru fiecare gamă individuală. În cele din urmă, rețineți că toate metodele comune, moștenite din rangeObj utilizează proprietățile de la și la proprietăți și se referă la acestea folosind acest cuvânt cheie, ceea ce indică obiectul pe care sunt solicitate aceste metode. Acest mod de utilizare este o caracteristică fundamentală a metodelor din orice clasă.

constructori

Constructorii sunt chemați folosind noul cuvânt cheie. Utilizarea noului cuvânt cheie pentru a apela constructorul creează automat un obiect nou, astfel încât designerul trebuie doar să inițializeze proprietățile acestui nou obiect. O caracteristică importantă a apelării unui constructor este folosirea proprietății prototip a constructorului ca prototip al noului obiect. Aceasta înseamnă că toate obiectele create cu același constructor moștenesc același obiect prototip și, prin urmare, sunt membri ai aceleiași clase.

Următorul exemplu demonstrează modul în care puteți implementa clasa Range prezentată mai devreme, fără a utiliza funcția din fabrică, dar utilizând funcția constructor:

Este logic să comparăm aceste două exemple în detaliu și să notăm diferențele dintre aceste două moduri de definire a claselor. Mai întâi, rețineți că la convertirea la constructor, intervalul de funcții din fabrică () a fost redenumit la Range (). Aceasta este convenția obișnuită a aspectului: funcțiile constructorului definesc într-un anumit sens clasele și numele claselor încep cu litere mari. Numele funcțiilor și metodelor obișnuite încep cu caractere minuscule.







Apoi, rețineți că constructorul Range () este apelat (la sfârșitul exemplului) cu cuvântul cheie nou, în timp ce intervalul funcției din fabrică () este numit fără acesta. În primul exemplu, a fost apelată o funcție normală pentru a crea un obiect nou, iar în al doilea a fost apelat un constructor. Deoarece constructorul Range () este apelat cu noul cuvânt cheie, nu este necesar să apelați funcția inherit () sau să luați orice altă acțiune pentru a crea un obiect nou. Un nou obiect este creat automat înainte de a apela constructorul și este disponibil în constructor ca valoare a acestuia. Constructorul Range () trebuie doar să îl inițializeze.

Constructorii nu trebuie să returneze nici un obiect nou creat. Expresia de apel a constructorului creează automat un obiect nou, numește constructorul ca metodă a acestui obiect și returnează obiectul. Faptul că apelarea unui constructor este atât de diferită de a numi o funcție normală este un alt motiv pentru care, de obicei, designerii primesc nume care încep cu o literă principală. Constructorii sunt concepuți pentru a fi numiți sub formă de constructori, cu cuvântul cheie nou și, de obicei, atunci când sunt chemați sub forma unor funcții obișnuite, nu pot să-și îndeplinească corect activitatea. Convenția de numire pentru designeri, care oferă o diferență vizuală între numele constructorilor și numele funcțiilor obișnuite, ajută programatorii să-și amintească să utilizeze cuvântul cheie nou.

O altă diferență importantă constă în metoda numelui unui obiect prototip. În primul exemplu, prototipul a fost un obiect rangeObj. A fost un nume convenabil, descriptiv, dar în mare măsură arbitrar. În cel de-al doilea exemplu, prototipul este proprietatea Range.prototype, iar acest nume este necesar. Apelul constructor Range () utilizează automat proprietatea Range.prototype ca prototip al noului obiect Range.

În cele din urmă, acordați atenție acelorași fragmente de exemple - în ambele clase, metodele obiectului de domeniu sunt definite și numite în același mod.

Proprietatea constructorului

În al doilea exemplu, proprietății Range.prototype i sa atribuit un obiect nou care conține metodele din clasă. Deși a fost convenabil să se definească metode ca proprietăți ale unui singur obiect literal, dar nu era absolut necesar să se creeze un obiect nou.

Prezența unui prototip predefinit de obiect cu proprietatea constructorului înseamnă că obiectele moștenesc de obicei proprietatea constructorului, care se referă la constructorii lor. Deoarece constructorii joacă rolul de identificatori de clasă, proprietatea constructorului definește o clasă de obiecte:

Aceste relații între funcția constructorului, prototipul său, referința inversă de la prototip la constructor și instanțele create de constructor sunt ilustrate în următoarea diagramă:

Javascript, Clase

Rețineți că constructorul Range () a fost luat ca exemplu pentru această diagramă. Cu toate acestea, clasa Range înlocuiește obiectul predefinit Range.prototype cu propriul său. Și noul obiect prototip nu are proprietatea constructorului. Din acest motiv, exemplele clasei Range, după cum implică definiția, nu au proprietatea constructorului. Puteți rezolva această problemă prin adăugarea explicită a constructorului la prototip:

O altă modalitate tipică este de a folosi un obiect predefinit de prototip care are deja o proprietate a constructorului și de a adăuga metode la acesta:







Articole similare

Trimiteți-le prietenilor: