Clasele? Nu, nu a auzit
Codul de mai sus ne dă myCar obiect numit și metodele claxon () și unitatea ().
Dar dacă avem nevoie pentru a crea 30 de obiecte? Cum de a evita crearea de metode pentru fiecare obiect manual? În lumea reală, aranjamente speciale sunt utilizate pentru producția de masă a tuturor lucrurilor. În mod similar, lucrurile și limbi străine cu modelul de clasă, care, prin crearea unei clase, vom obține imediat mecanismul de a crea obiecte bazate pe ea:
Cea mai simplă opțiune - a scrie o funcție simplă, care va marca obiecte cu aceleași proprietăți și metode. Astfel de obiecte nu pot fi legate.
O altă opțiune - a scrie o funcție specială, care nu numai că va crea obiecte, dar, de asemenea, pentru a le conecta între ele. Toate aceste facilități sunt disponibile un set de metode. Dacă decideți mai târziu să-l schimbe, de exemplu, adăugați o nouă metodă, nu numai că în viitor facilități, dar, de asemenea, în toate deja creat această metodă.
Să ne uităm la ambele opțiuni mai detaliat.
Crearea de obiecte prin intermediul unei funcții simplu
În primul exemplu, am creat obiectul myCar și se adaugă la ea câteva metode. Plasați acest cod într-o funcție:
Acum putem folosi această funcție pentru a ștanțare facilități:
În plus, facilitățile noastre nu sunt conectate între ele. Această situație este foarte asemănătoare cu mașinile reale cu automobile reale: toate acestea arata la fel, dar de îndată ce părăsesc linia de asamblare, acestea sunt complet independente una de cealaltă. Dacă în mijlocul modelului de producție al defectului este descoperit, pentru îndepărtarea lui la producător va trebui să se întoarcă toate mașinile înapoi la fabrica de automobile.
Dar, în lumea virtuală, avem nevoie nu vă limitați în acest fel. Putem crea obiecte în așa fel încât să fie în măsură să le schimbe dintr-o dată.
Crearea de obiecte folosind constructorul
Pentru a începe cu decizia de a repeta o funcție simplă care churns obiecte independente, dar în formă constructor:
Acum putem apela această funcție cu noul operator. și anume:
Noul operator creează un obiect nou și solicită funcția de constructor ca metodă de acel obiect (adică, cu referire la obiectul în variabila acest lucru), iar apoi returnează obiectul creat. Simplificați activitatea noului operator poate fi ilustrat prin următorul cod pseudo:
Așa cum am spus deja, designerul nostru repetă soluția cu o funcție simplă. Nu avem nevoie pentru a crea obiecte de mână, dar încă nu se poate schimba metoda claxon () în același timp, pe toate obiectele create. Dar am pregătit deja bazele pentru acest lucru. Toate obiectele create de designerul, pentru a primi o proprietate specială, conectându-le cu proiectantul:
Toate obiectele create myCar legate de constructor auto. Aceasta este ceea ce îi diferențiază de un set aleatoriu de obiecte cu aceleași metode și nume similare.
Acum e timpul să vorbim despre prototipuri, pe care le-am menționat mai devreme în acest articol.
Folosind un prototip pentru a crea obiecte cu funcționale comune
Așa cum am scris într-un model prototip de tehnici de programare care sunt comune pentru toate obiectele care sunt plasate în prototip de obiect. Dar, în cazul în care este obiectul prototip pentru instalațiile noastre myCar. pentru că nu am creat? El a creat implicit pentru noi, și este înregistrată în proprietatea Car.prototype.
S-ar putea înlocui, de asemenea, o metodă existentă la următoarea:
Putem schimba chiar metoda este doar una dintre facilitățile noastre:
În ultimul exemplu, este important să înțelegem ce se întâmplă în spatele scenei. După cum știm deja, la momentul convocării interpretul trece un anumit mod, în scopul de a efectua această metodă. Un obiect myCar1 încă nu au o metodă de determinare a metodei claxon () și învelișul executa obiectul prototip. Dar, în cazul myCar2 totul este diferit, el are acum metoda sa proprie claxonează (). astfel încât interpretul nu se mai aplică pentru această metodă pentru un prototip.
Observați utilizarea cât mai eficientă a prototipului în comparație cu crearea de copii ale metodelor. După cum sa menționat deja, interpretul nu este clar că aceste metode trebuie să fie identice, astfel că alocă memorie pentru fiecare metodă de fiecare obiect creat de noi. Dar, în cazul prototipului este diferit - memoria este alocată o singură dată, indiferent de cât de multe obiecte putem crea.
Nu a fi nefondate, voi da o comparație foarte simplu. Primul exemplu creează un milion de obiecte și fiecare dintre ele adaugă o copie a unei singure metode:
În Google Chrome, zona de memorie de 328 MB. Dar, același exemplu, dar metoda este transferată la prototipul:
În acest moment, dimensiunea zona de memorie de 17 MB, care este de aproximativ 5% din valoarea anterioară.
moștenire
Fără îndoială, este convenabil să aibă o clasă de obiecte care împărtășesc metode, dar de multe ori au nevoie pentru a crea un număr de diferite clase de obiecte cu unele funcții comune. Imaginați-vă că nu există doar masini, ci biciclete în lumea noastră virtuală minunat. Și ambii știu cum să călărească, dar în schimb au un clopot corn de biciclete.
Astfel, metoda de antrenare () - totalul pentru ambele clase, în timp ce Honk () metodele și inelul () sunt fiecare la clasa lui. Selectăm Vehiculului de clasă. din care va fi moștenită de clase de mașini și biciclete.
ierarhie de clasă Schema- Interpretul caută o unitate () metoda în myCar obiect. Această metodă în obiectul nu există;
- Interpretul caută o unitate de metodă () în constructorul auto prototip. care este obiectul creat folosind proiectul vehiculului. Există, de asemenea, nici o metodă;
- Interpretul caută un prototip de antrenare metoda () în vehicul de proiectare. unde este metoda dorită.
Clasele? Nu, nu a auzit. partea 2
Să vedem ce se întâmplă. Să considerăm un exemplu:
Acest cod oferă aproape același rezultat ca și crearea de designeri, dar este mult mai scurt. Metoda de culise Object.create () creează un constructor temporar ca un prototip care foloseste obiect ne-a trecut. După această metodă returnează un obiect, care a creat de constructor temporar.
Dar stai un minut, am creat, de asemenea, metode de antrenare () și claxonul () în mod direct, în sine, obiectele în loc de prototipuri lor, cu excepția faptului că nu va duce la o creștere a consumului de memorie? În acest caz - nr. Am creat patru obiecte diferite, două dintre ele - sunt obiecte myCar. creat pe baza obiectului auto. Dar, în timp ce metodele se claxoneaza () și unitate () sunt definite doar o singură dată, și, în consecință, în memorie, ele există doar o singură dată. Experimentul:
Se pare că dimensiunea memoriei alocate în continuare a crescut - de până la 40 MB. Dar, în schimb pentru codul de simplificare este permis să se sacrifice.