Ce este suprasolicitarea în JavaScript?

Pentru a înțelege conceptul de suprasolicitare în JavaScript, să revizuim mai întâi conceptul de generalizare generală.

Metoda Suprascriere este un concept OOPs strâns legat cu moștenire. Atunci când o metodă de clasă copil înlocuiește metoda clasei părinte cu același nume, parametri și tip de retur, aceasta este denumită metodă de suprasolicitare. De asemenea, reamintim că aceasta este complet diferită de conceptul de supraîncărcare a metodei. Supraîncărcarea metodei apare atunci când există două funcții cu același nume, dar parametri diferiți.

Acum, să încercăm să înțelegem acest concept din punctul de vedere al JavaScript. Știm că JavaScript nu este „relativ” orientat pe obiecte. Are conceptul de Obiecte care îl califică ca fiind orientat pe obiecte, dar nu are conceptul de clase. Este de natură prototipică. Da, te aud strigând tare că putem declara clase în JavaScript, dar permiteți-mi să vă reamintesc că această notație de clasă este doar un zahăr sintactic pentru arhitectura prototipică de bază.

Așadar, JavaScript acceptă conceptul de suprapunere a metodei. Și o face în moduri foarte ciudate. La urma urmei, este cel mai neînțeles limbaj din lumea programării. JavaScript acceptă supraîncărcare, dar nu supraîncărcare.

Notă - De-a lungul exemplelor din acest articol, am folosi consola de dezvoltare a browserelor. Pur și simplu deschideți instrumentele dezvoltatorului browserului (Ctrl / Cmd + Shift + C) și accesați fila Console din fereastra instrumentelor pentru dezvoltatori.

Arată așa în Chrome:

Acesta este locul de joacă pentru majoritatea conceptelor legate de JavaScript. Am folosi acest loc de joacă în tot acest articol.

Cum funcționează Overriding în JavaScript?

În JavaScript, toate obiectele moștenesc de la prototipul Obiect. Toate obiectele sunt instanțe ale obiectului. Astfel, de fiecare dată când creați un obiect nou, JavaScript definește automat o proprietate _proto_ (prototip) pentru noul obiect. Când este creat un obiect copil, acesta are din nou o proprietate _proto_ și așa mai departe. Acum, când încercați să accesați o metodă sau o proprietate a unui obiect, JavaScript verifică mai întâi dacă obiectul are acea metodă / proprietate. Dacă nu, JavaScript verifică dacă _proto_ obiectul are această metodă / proprietate. Dacă nu, JavaScript verifică dacă _proto_ obiectul său mamă are acea metodă / proprietate. Continuă căutarea lanțului până când metoda / proprietatea este găsită sau _proto_ din obiect este întâlnită și căutată. De exemplu, Date.prototype. (Prototip) este Object.prototype.

Acum vedeți lanțul cu susul în jos. Așa funcționează imperativul în JavaScript. O metodă ar continua să înlocuiască metoda obiectului părinte, chiar dacă este o metodă a obiectului. De exemplu, putem chiar să înlocuim funcționalitatea de bază, cum ar fi crearea unui obiect Date.

Să vedem acest lucru cu un exemplu:

new Date(); //the JavaScript Date() method
//overriding the JavaScript Date() method
function Date()(
this.date = "This method overrides the default constructor of Date class.";
);
var date2 = new Date();
console.log(date2);

Tipuri de suprasolicitare în JavaScript

Nu există tipuri de suprasemnare definite în JavaScript. Cu toate acestea, bazându-ne pe comportamentul limbajului de programare, putem spune că metoda care trece peste JavaScript funcționează în următoarele moduri.

1) Primul comportament

Primul mod este cel pe care l-am văzut mai sus când am definit o metodă pentru a trece peste constructorul de date implicit al JavaScript. Acest lucru este într-un mod similar cu al treilea mod ilustrat mai jos, deoarece toate obiectele din JavaScript sunt o instanță a prototipului Obiect. Ceea ce diferențiază cel de-al treilea comportament este utilizarea super-cuvântului cheie. Vom vedea mai multe când ilustrăm al treilea comportament.

Să vedem un alt exemplu similar. De această dată, am înlocui funcționalitatea de alertă. Comportamentul implicit al funcției de alertă în JavaScript este afișarea unei mici casete de dialog în partea de sus a paginii cu mesajul pe care îl transmitem ca parametru.

Acum, când îl înlocuim cu propriul nostru cod, funcția implicită de alertă nu mai este apelată.

function alert(msg) (
console.log(msg);
);
alert("This is an alert.");

2) Al doilea comportament

Al doilea mod este atunci când încercăm să supraîncărcăm funcții în JavaScript. Nu uitați, JavaScript nu acceptă supraîncărcarea funcțiilor. Deci, în loc să vă supraîncărcați funcția, JavaScript ar înlocui toate definițiile anterioare ale funcției dvs. cu cea mai recentă.

Să vedem asta în acțiune.

//Calculate area of rectangle
function calculateArea(x, y)(
return x*y;
)
//Calculate area of square
function calculateArea(a)(
return a*a;
)
console.log("Area of rectangle 2x3 is : " + calculateArea(2, 3));
console.log("Area of square 5x5 is : " + calculateArea(5));

Observați rezultatul. JavaScript apelează întotdeauna a doua definiție a funcției și returnează pătratul primului parametru. Parametrii următori sunt ignorați.

3) Al treilea comportament

Al treilea comportament apare în imagine atunci când implicăm clase și moștenire în JavaScript. Când o clasă copil moștenește metodele clasei părinte și își definește propriile metode cu același nume, metodele clasei părinte sunt suprasolicitate. Acest lucru nu ne-am dori în aplicațiile din viața reală. Am dori ca metodele clasei noastre de părinți să fie accesibile chiar și atunci când sunt suprasolicitate de metodele clasei de copii. Deci, super-cuvântul cheie vine la salvarea noastră. Folosind superul cuvânt cheie, putem accesa metodele clasei părinte.

Să vedem asta în acțiune.

//the parent class
class Person (
greet() (
console.log("Hello. I am a person.");
);
)
//the child class
class Employee extends Person (
greet() (
super.greet(); //calling parent class method via keyword 'super'
console.log("Hello. I am an employee.");
)
)
let per = new Person(); //parent class object
let emp = new Employee(); //child class object
per.greet();
emp.greet();

Acum revino la primul exemplu de comportament și încearcă să folosești super-cuvântul cheie acolo. Ai observa că nu funcționează. Aceasta deoarece atunci când am creat metoda noastră în primul exemplu, nu am extins clasa părintească. Am creat metoda în sfera globală, trecând astfel peste toate celelalte definiții ale metodei.

Concluzie

Haideți să ne revizuim înțelegerea metodei care depășește JavaScript. Am aflat că JavaScript acceptă supraîncărcare, dar nu supraîncărcare. Dacă încercăm să supraîncărcăm metode, JavaScript înlocuiește toate definițiile anterioare prin cele mai recente. Acest lucru este valabil chiar și pentru funcțiile de bază!

În continuare, am văzut cum putem înlocui metodele din clasele pentru copii și, ulterior, accesăm metodele clasei părinte, așa cum este necesar. Acesta este un concept foarte util, deoarece ne permite să extindem funcționalitatea claselor noastre de părinți și îmbunătățește astfel reutilizarea codului.

Articole recomandate

Acesta este un ghid de suprasolicitare în JavaScript. Aici vom discuta despre cum funcționează suprasolicitarea în JavaScript și Tipurile de suprapunere în JavaScript. De asemenea, puteți consulta articolul următor pentru a afla mai multe -

  1. Ce Javascript poate face?
  2. Ce este JavaScript?
  3. Cum se instalează JavaScript
  4. Python Frameworks - ce este cadrul python?
  5. Introducere în suprasolicitarea în C ++
  6. Introducere în Suprapreding în OOP-uri
  7. Suprasolicitare în Java
  8. Supraîncărcarea metodei în C #
  9. Supraîncărcare și suprasolicitare în C #