Rezumat: în acest tutorial, veți învăța cum funcționează moștenirea prototipală JavaScript.
Introducere la moștenirea prototipală JavaScript
Dacă ați lucrat cu alte limbaje de programare orientate pe obiecte, cum ar fi Java sau C++, ați fost familiarizat cu conceptul de moștenire.
În această paradigmă de programare, o clasă este un plan pentru crearea de obiecte. Dacă doriți ca o nouă clasă să reutilizeze funcționalitatea unei clase existente, puteți crea o nouă clasă care extinde clasa existentă. Acest lucru se numește moștenire clasică.
JavaScript nu utilizează moștenirea clasică. În schimb, folosește moștenirea prototipală.
În moștenirea prototipală, un obiect „moștenește” proprietăți de la un alt obiect prin intermediul legăturii prototip.
Moștenirea prototipală JavaScript și __proto__
Să luăm un exemplu pentru a face conceptul mai clar.
Cele ce urmează definesc un obiect person
:
Code language: JavaScript (javascript)
Obiectul person
are două proprietăți:
-
name
care deține o valoare de șir de caractere. -
greet
care deține o valoare care se întâmplă să fie o funcție.greet
este cunoscută ca o metodă a obiectuluiperson
.
În mod implicit, JavaScript vă oferă o funcție Object()
și un obiect prototip care poate fi accesat prin intermediul proprietății prototype
a funcției Object()
:
Când utilizați sintaxa literalului obiect pentru a defini un obiect, obiectul este o instanță a Object
. Prin urmare, expresia person instanceof Object
returnează true
:
Code language: JavaScript (javascript)
Output:
Code language: JavaScript (javascript)
Obiectul person
se leagă, de asemenea, de Object.prototype
prin intermediul legăturii ]
.
Cu alte cuvinte, puteți accesa orice proprietăți ale obiectului Object.prototype
prin intermediul obiectului person
. De exemplu:
Code language: JavaScript (javascript)
Output:
Code language: JavaScript (javascript)
Ceea de este conversia implicită de la un obiect la șir de caractere.
Când apelați metoda toString()
pe obiectul person
, JavaScript nu îl poate găsi. Astfel, JavaScript urmărește lanțul prototipurilor și caută metoda pe obiectul Object.prototype
. JavaScript poate găsi metoda toString() pe obiectul Object.prototype
și o execută.
Pentru a accesa prototipul obiectului person
, puteți utiliza proprietatea __proto__
a acestuia:
Code language: JavaScript (javascript)
Output:
Code language: JavaScript (javascript)
În cele ce urmează se definește un alt obiect numit teacher
. Obiectul teacher
are metoda teach()
:
Code language: JavaScript (javascript)
Dacă doriți ca obiectul teacher
să acceseze toate proprietățile obiectului person
, puteți seta prototipul obiectului teacher
la obiectul person
:
Code language: JavaScript (javascript)
Rețineți că nu trebuie să utilizați niciodată __proto__
în codul de producție. Aceasta este doar în scop de învățare și înțelegere.
Acum, obiectul teacher
poate accesa proprietatea name
și metoda greet()
din obiectul person
prin intermediul lanțului de prototipuri:
Code language: JavaScript (javascript)
Output:
Code language: JavaScript (javascript)
Când apelați metoda greet()
pe obiectul teacher
, JavaScript o găsește mai întâi pe obiectul teacher
.
Din moment ce JavaScript nu găsește metoda pe obiectul teacher
, urmează lanțul prototipurilor și caută metoda pe obiectul person
. De data aceasta, JavaScript poate găsi metoda pe obiectul person
și execută metoda greet()
.
În JavaScript, spunem că obiectul teacher
moștenește proprietăți ale obiectului person
. Și aceasta este moștenirea prototipală.
Un mod standard de a implementa moștenirea prototipală în ES5
ES5 a oferit un mod standard de a lucra cu moștenirea prototipală prin utilizarea metodei Object.create()
.
Rețineți că acum ar trebui să folosiți cuvintele cheie mai noi din ES6 class
și extends
pentru a implementa moștenirea. Este mult mai simplu.
Metoda Object.create()
creează un nou obiect și utilizează un obiect existent ca prototip al noului obiect:
Code language: JavaScript (javascript)
Metoda Object.create()
acceptă două argumente:
- Primul argument (
proto
) este un obiect utilizat ca prototip pentru noul obiect. - Cel de-al doilea argument (
propertiesObject
), dacă este furnizat, este un obiect opțional care definește proprietăți suplimentare pentru noul obiect.
Să presupunem că aveți un obiect person
:
Code language: JavaScript (javascript)
În cele ce urmează se creează un obiect teacher
gol cu __proto__
al obiectului person
:
Code language: JavaScript (javascript)
După aceea, puteți defini proprietăți pentru obiectul teacher
:
Code language: JavaScript (javascript)
Sau puteți face toți acești pași într-o singură instrucțiune, după cum urmează:
Code language: JavaScript (javascript)
ES5 a introdus, de asemenea, metoda Object.getPrototypeOf()
care returnează prototipul unui obiect. De exemplu:
Code language: JavaScript (javascript)
Output:
Code language: JavaScript (javascript)
Summary
- Ereditarismul permite unui obiect să utilizeze proprietățile și metodele unui alt obiect.
- JavaScript folosește moștenirea prototipală obținută prin legarea prototipurilor.
- A fost util acest tutorial?
- DaNu
.