Вероятно сте чували много за термините прототипно наследяване и класическо наследяване. Но какво всъщност означават те?

Преди да се заровите в тези дефиниции на наследяване, трябва да разберете какво представляват прототипите и класовете в javascript.

Прототипът е обект, който съдържа списък с методи и полета, които са достъпни по подразбиране.

Да вземем например метода indexOf от низ. Никога не сме го дефинирали, но винаги когато искаме да имаме достъп до този метод от произволен низ, можем да го направим.

Ако направите console.log на прототип на низ, ето какво ще получите:

Така че сега знаем какво е прототип. Какво тогава е наследяването на прототип?

Наследяването на прототип е идеята, че всеки отделен обект наследява списък с методи и полета по подразбиране от прототипа.

Например обект Array би наследил списък от методи и полета, специфични за обекта прототип на масив. Функции като карта, намаляване и филтриране са прототипни методи, които се наследяват от всеки масивен обект.

И разбира се, тъй като всичко е обект в javascript, всеки отделен обект също наследява от обектно наследяване, което съдържа различен набор от методи и полета.

Сега нека поговорим за класове в javascript.

Класовете в JavaScript са функции, добавени към ES6, които имат за цел да имитират ключовата дума class от други езици. Като цяло, следните функции са включени в клас:

  • конструктор
  • методи

В действителност класовете са просто синтактична захар около прототипното наследяване. Идеята е да се категоризира серия от поведения и полета в един тип клас.

Ето пример за клас и класическо наследяване в javascript:

С други думи, класическото наследяване е идеята един клас да наследява функции и променливи от родителски клас. Имайте предвид, че класическото наследяване е строго ограничено до наследяване между два класа.

В примера по-горе имаме клас човек и клас ученик. Класът person съдържа променлива име и функция, която отпечатва нейното име.

Класът ученик е дъщерен клас на класа човек, главният клас. Този клас студент не само има достъп до собственото си поле, id, но също така има достъп до полетата и методите на своя родителски клас (this.getName() и име);

Схванах го. Какво е прототипно наследяване?

Прототипното наследяване е идеята, че един обект може да наследи всички свойства на друг обект.

Да приемем, че декларирате const str = „hi“ и вие console.log(str._proto_) на страницата с инструменти за разработчици, ще можете да видите [constructor: ƒ, concat: ƒ, pop: ƒ, push: ƒ, …].

Ако разширите тази част от текста, ще видите списък с наследени прототипни методи и полета, до които всеки обект има достъп.

Можете също така да добавяте нови прототипни методи към всякакви обекти, като например масив. Можете да напишете Array.prototype.newMethod = newMethod и всички нови масиви, които създавате, имат достъп до това поле. Това е една важна концепция за прототипното наследяване.

Добре, каква е основната разлика между прототипното наследство и класическото наследство?

Прототипното наследяване позволява на всякакви обекти да наследяват методи и полета на всякакви други обекти, докато класическото наследяване поддържа само наследяване между обекти на клас.

Това е! Вече разбирате основите на всеки прототип и наистина разликата между двата.