Суперкласове и подкласове

Научихме, че обектите наследяват свойства от 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 &&