JavaScript Prototypal Inheritance

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 obiectului person.

Î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

.

Lasă un răspuns

Adresa ta de email nu va fi publicată.