Наследяване и верига на прототипи - JavaScript, MDN
Прототипно верижно наследяване
Наследяване на имоти
Когато се добави ново свойство към обект, се създава ново собствено свойство. Единственото изключение от това правило са наследените свойства, които имат getter или setter.
Наследяване на "методи"
Различни начини за създаване на обекти и произтичащите вериги от прототипи
Създаване на обекти с литерали
Създаване на обекти с конструктор
Object.create
ECMAScript 5 въвежда нов метод за създаване на обекти: Object.create. Прототипът на създадения обект е посочен в първия аргумент на този метод:
Използване на ключовата дума class
производителност
Дългото време за търсене на свойства, които са относително високо във веригата на прототипа, може да повлияе негативно на производителността, особено на критични места в кода в този смисъл. В допълнение, опитът за намиране на несъществуващи свойства неизбежно ще доведе до проверка за тяхното присъствие във всички обекти от веригата на прототипа.
Освен това преминаването през свойствата на обект ще премине през всяко свойство, присъстващо във веригата на прототипа.
Ако трябва да проверите дали дадено свойство е дефинирано в самия обект, а не някъде в неговата верига от прототипи, можете да използвате метода hasOwnProperty, който всички обекти наследяват от Object.prototype.
Лоша практика: Разширяване на основни прототипи
Една често срещана грешка е разширяването на Object.prototype или други основни прототипи.
Този подход се нарича monkey patching и нарушава принципа на капсулиране. Въпреки факта, че преди това е бил използван в толкова широко използвани рамки като, напр.Prototype.js, в момента няма разумна причина да се използва, тъй като в този случай вградените типове са "затрупани" с допълнителна нестандартна функционалност.
Единственото оправдание за разширяване на базовите прототипи е polyfills - емулатори на нова функционалност (например Array.forEach) за неподдържащи реализации на езика в по-стари уеб браузъри.
B наследява от A:
- Типовете са дефинирани в .prototype
- Object.create() се използва за наследяване
прототип и Object.getPrototypeOf
[[Prototype]] работи рекурсивно, т.е. когато извиквате:
и когато направиш така: