Повече за обектния модел - JavaScript, MDN

Преводът не е завършен. Моля, помогнете при превода на тази статия от английски.

Езици въз основа на класа срещу езици, базирани на прототип

Основаните на класа обектно-ориентирани програмни езици като Java и C ++ са изградени върху концепцията за две отделни обекти: клас и екземпляр.

  • Клас дефинира всички свойства (дадени методи и всички полета в Java или свойства в C ++), които характеризират група обекти. Класът е абстрактно нещо, а не конкретен член от набора от обекти, които той описва. Например класът Employee може да опише набор от всички служители.
  • Екземпляр е въплъщение на клас като конкретен обект. Например, Виктория може да бъде екземпляр на класа Employee, представляващ конкретен служител. Екземпляр на клас има точно толкова свойства, колкото родителския клас (не повече и не по-малко).

Определение на класа

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

Подкласове и наследяване

Добавяне и премахване на свойства

Нека обобщим разликите

Изграждането на йерархия на обектите става чрез присвояване на обект като прототип на конструкторска функция.

Пример служител

Останалата част от тази глава обяснява йерархията на служителите, показана на следващата фигура:

Фигура 8.1: Йерархия на прости обекти

Този пример използва следните обекти:

  • Служителят има име на свойство (което по подразбиране е празен низ) и dept (което по подразбиране е "общо").
  • Мениджърът се основава на служител. Той добавя свойство за отчети (което по подразбиране е празен масив, за да съдържа масив от обекти на служители).
  • WorkerBee също се базира на служител. Той добавя свойството projects (което по подразбиране е празен масив за съхраняване на низове).
  • SalesPerson се основава на WorkerBee. Той добавя свойство квота (което по подразбиране е 100). Той също така заменя свойството dept със стойността "продажби", за да покаже, че всички търговци са в един и същ отдел.
  • Инженерът се основава на WorkerBee. Той добавя свойството на машината (което по подразбиране е празен низ) и също така определя свойството dept като "инженерно".

Създаване на йерархия

Има няколко известни начина за дефиниране на подходящи конструкторски функции, които прилагат йерархията на служителите. Изборът на метод за откриване зависи до голяма степен от това, за което е предназначено вашето приложение.

Този раздел предоставя много прости (и относително негъвкави) дефиниции, за да демонстрира как работи наследяването. В тези дефиниции не можете да задавате стойности за свойства, когато създавате обект. Свойствата на новосъздадения обект просто получават стойности по подразбиране, които могат да бъдат променени по-късно.

В реално приложение вероятно ще дефинирате конструктори, които ви позволяват да зададете стойностите на свойствата, които искате по време на създаването на обект (вижте Още гъвкави конструктори). В този случай конструкторите са умишлено опростени, за да се съсредоточат върху същността на наследството.

Класовете Engineer и SalesPerson създават обекти, които произлизат от WorkerBee и следователно от Employee. Обект от тези типове има свойствата на всички обекти, разположени над него в йерархията. Също така тези класове заменят наследствената стойност на свойството dept с техните стойности, специфични за тези обекти.

Използвайки тези дефиниции, можете да създадете екземпляр на обекти, които ще получат стойности по подразбиране за техните свойства. Фигура 8.3 илюстрира използването на тези дефиниции и показва стойностите на свойствата на получените обекти.

Фигура 8.3: Създаване на обекти с прости дефиниции

Свойства на обекта

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

Наследяване на собственост

Да предположим, че създавате обект за маркиране като WorkerBee (както е показано на фигура 8.3) със следния израз:

Тъй като тези конструктори не ви позволяват да въвеждате специфични за екземпляра стойности, добавената информация е обща. Стойностите на свойствата са зададени по подразбиране на еднакви за всички обекти, създадени от функцията WorkerBee. Можете, разбира се, да промените стойностите на всяко от тези свойства. Така че, можете да добавите информация, специфична за марки, като тази:

Добавяне на свойства

Обектът марка вече има бонус свойство, но никой друг WorkerBee няма това свойство.

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

Фигура 8.4: Добавяне на свойства