Суперкласове и подкласове
Научихме, че обектите наследяват свойства от prototype_object на техния конструктор. Как могат също така да наследят свойства от класа Object? Спомнете си, че самият prototype_object е обект; създава се с const_
1 Но с такава дефиниция релационните оператори придобиват доста „странна“ семантика. –Забележка научен изд.
9.5. Суперкласове и подкласове |
манипулатор Object(). Това означава, че object_prototype наследява свойства от Object_ject.prototype! Следователно обект от класа Complex наследява свойства от обекта Complex_plex.prototype, който от своя страна наследява свойства от Object.prototype. Когато се търси свойство в сложен обект, първо се търси самият обект. Ако свойството не бъде намерено, търсенето продължава в обекта Complex.prototype. И накрая, ако свойството не е намерено и в този обект, се извършва търсене в обекта Object.prototype.
Имайте предвид, че тъй като prototype_object на Complex се търси преди prototype_object на Object, свойствата на обекта Complex.prototype скриват всички свойства със същото име от Object.prototype. Например в класа, показан в пример 9-2, дефинирахме метод toString() на обекта Complex.prototype. Object.prototype също дефинира метод с това име, но комплексните обекти никога няма да го видят, защото дефиницията на toString() в Complex.proto_type ще бъде намерена първа.
Всички класове, които показахме в тази глава, са директни подкласове на класа Object. Това е типично за програмирането на Java_Script; обикновено няма нужда да се създава по-сложна класова йерархия. Въпреки това, когато е необходимо, можете да подкласирате всеки друг клас. Да предположим, че искаме да създадемподклас на класа Rectangle, за да добавите свойства и методи, свързани с координатите на правоъгълника. За да направим това, просто трябва да сме сигурни, че прототипният обект на новия клас сам по себе си е екземпляр на Rectangle и следователно наследява всички свойства на Rectang_le.prototype. Пример 9-3 повтаря дефиницията на прост клас Rectanle и след това разширява тази дефиниция чрез създаване на нов клас, PositionedRectangle.
// Дефиниране на клас прост правоъгълник.
// Този клас има ширина и височина и може да изчисли своя собствена функция за площ Rectangle(w, h)
// Следва дефиницията на подклас
функция PositionedRectangle(x, y, w, h)
// Първо, трябва да извикате конструктора на суперклас
// за инициализиране на свойствата за ширина и височина на новия обект.
// Това е мястото, където се използва методът за извикване, за да се извика конструкторът
// като метод на инициализирания обект.
// Това се нарича извикване на верижен конструктор. Извикване на правоъгълник (това, w, h);
// След това се съхраняват координатите на горния ляв ъгъл на правоъгълника this.x = x;
// Ако използваме прототипния обект по подразбиране,
// който се създава, когато се дефинира конструкторът PositionedRectangle(),
// ще бъде създаден подклас на класа Object.
184 Глава 9. Класове, конструктори и прототипи
// За да създадете подклас на класа Rectangle, трябва изрично да създадете prototype_object. PositionedRectangle.prototype = нов правоъгълник();
// Създадохме прототип на обект за целите на наследяването, но няма да го направим
// наследява свойствата на ширината и височината, които имат всички обекти
// class Rectangle, така че ги премахнете от прототипа.
изтриване на PositionedRectangle.prototype.width; ИзтрийPositionedRectangle.prototype.height;
// Тъй като prototype_object е създаден с помощта на конструктора
// Rectangle(), свойството на конструктора в него се отнася за това
// конструктор. Но имаме нужда от обектите PositionedRectangle
// препраща към друг конструктор, така че се изпълнява следното
// присвояване на нова стойност на конструктора на свойството PositionedRectangle.prototype.constructor = PositionedRectangle;
// Вече имаме правилно конфигуриран прототип за нашия
// подклас, можете да започнете да добавяте методи на екземпляр. PositionedRectangle.prototype.contains = функция(x,y)
return (x > this.x && x this.y && y 1 Можете също така да искате да премахнете всички свойства, които са създадени от конструктора на суперклас върху prototype_object, тъй като е много важно свойствата на prototype_object да наследяват отнеговияпрототип.
Като се има предвид тази дефиниция на класа PositionedRectangle, можете да го използвате във вашите програми по следния начин:
var r = нов | Позициониран правоъгълник (2,2,2,2); | |||
print(r.contains(3,3)); // | Наречен | инстанционен метод | ||
печат (r.area( )); | // | Наречен | метод на наследен екземпляр | |
// Работа | с | полета | инстанция | клас: |
печат (r.x | + | ", " + | r.y + ", " | + r.width + ", " + r.height); |
// Нашият обект може да се счита за екземпляр на всичките 3 класа
9.5. Суперкласове и подкласове |
print(r instanceof PositionedRectangle && r instanceof Rectangle &&