Чтение онлайн

на главную - закладки

Жанры

JavaScript. Подробное руководство, 6-е издание
Шрифт:

9.7.1. Определение подкласса

В языке JavaScript объекты наследуют свойства (обычно методы) от объекта-прототипа своего класса. Если объект

O
является экземпляром класса
В
, а класс
В
является подклассом класса
А
, то объект
O
также наследует свойства класса
А
. Добиться этого можно за счет наследования объектом-прототипом класса
В
свойств объекта-прототипа класса
А
, как показано ниже, с использованием функции
inherit
(пример 6.1):

В.prototype = inherit(A.prototype); // Подкласс наследует суперкласс

В.prototype.constructor = В; // Переопределить унаследованное св. constructor

Эти две строки являются ключом к созданию подклассов в JavaScript. Без них объект-прототип будет обычным объектом - объектом, наследующим свойства от

Object.prototype
, - а это означает, что класс будет подклассом класса
Object
, подобно всем остальным классам. Если добавить эти две строки в функцию
defineClass
(раздел 9.3), ее можно будет преобразовать в функцию
defineSubclass
и в метод
Function.prototype.extend,
как показано в примере 9.11.

Пример 9.11. Вспомогательные инструменты определения подклассов

// Простая функция для создания простых подклассов

function defineSubclass(superclass, // Конструктор суперкласса

constructor, // Конструктор нового подкласса

methods, // Методы экземпл.: копируются в прототип

statics) // Свойства класса: копируются в констр-р

{

// Установить объект-прототип подкласса

constructor.prototype = inherit(superclass.prototype);

constructor.prototype.constructor = constructor;

// Скопировать методы methods и statics, как в случае с обычными классами

if (methods) extend(constructor.prototype, methods);

if (statics) extend(constructor, statics);

// Вернуть класс

return constructor;

}

// To же самое можно реализовать в виде метода конструктора суперкласса

Function.prototype.extend = function(constructor, methods, statics) {

return defineSubclass(this, constructor, methods, statics);

};

Пример 9.12 демонстрирует, как определить подкласс «вручную», без использования функции def ineSubclass. В этом примере определяется подкласс SingletonSet класса Set. Класс SingletonSet представляет специализированное множество, доступное только для чтения и состоящее из единственного постоянно элемента.

Пример 9.12. SingletonSet: простой подкласс множеств

// Функция-конструктор

function SingletonSet(member) {

this.member = member; // Сохранить единственный элемент множества

}

// Создает объект-прототип, наследующий объект-прототип класса Set.

SingletonSet.prototype = inherit(Set.prototype);

// Далее добавляются свойства в прототип.

// Эти свойства переопределяют одноименные свойства объекта

Set.prototype. extend(SingletonSet.prototype, {

// Установить свойство constructor

constructor: SingletonSet,

// Данное множество доступно только для чтения: методы add и remove

// возбуждают исключение

add: function { throw "множество доступно только для чтения"; },

remove: function { throw "множество доступно только для чтения"; },

// Экземпляры SingletonSet всегда имеют размер, равный 1

size: function { return 1; },

// Достаточно вызвать функцию один раз и передать ей единственный элемент,

foreach: function(f, context) { f.call(context, this.member); },

// Метод contains стал проще: такая реализация пригодна только

// для множества с единственным элементом

contains: function(x) { return х === this.member; }

});

Класс

SingletonSet
имеет очень простую реализацию, состоящую из пяти простых методов. Этот класс не только реализует пять основных методов класса
Set
, но и наследует от своего суперкласса такие методы, как
toString, toArray и equals.
Возможность наследования методов является одной из основных причин определения подклассов. Метод
equals
класса
Set
(определен в разделе 9.6.4), например, может сравнивать любые экземпляры класса
Set
, имеющие методы
size
и
foreach,
с любыми экземплярами класса
Set,
имеющими методы
size
и
contains.
Поскольку класс
SingletonSet
является подклассом класса
Set
, он автоматически наследует его метод
equals
и не обязан иметь собственную реализацию этого метода. Безусловно, учитывая чрезвычайно упрощенную структуру множества, содержащего единственный элемент, можно было бы реализовать для класса
SingletonSet
более эффективную версию метода
equals:

Поделиться:
Популярные книги

Солдат Империи

Земляной Андрей Борисович
1. Страж
Фантастика:
попаданцы
альтернативная история
6.67
рейтинг книги
Солдат Империи

Газлайтер. Том 19

Володин Григорий Григорьевич
19. История Телепата
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Газлайтер. Том 19

Бандит

Щепетнов Евгений Владимирович
1. Петр Синельников
Фантастика:
фэнтези
7.92
рейтинг книги
Бандит

Хозяин Теней 7

Петров Максим Николаевич
7. Безбожник
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Хозяин Теней 7

Чужое наследие

Кораблев Родион
3. Другая сторона
Фантастика:
боевая фантастика
8.47
рейтинг книги
Чужое наследие

Первый среди равных. Книга II

Бор Жорж
2. Первый среди Равных
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Первый среди равных. Книга II

Княжья Русь

Мазин Александр Владимирович
6. Варяг
Приключения:
исторические приключения
9.04
рейтинг книги
Княжья Русь

Мельницы богов

Шелдон Сидни
Детективы:
прочие детективы
9.22
рейтинг книги
Мельницы богов

Тринадцатый V

NikL
5. Видящий смерть
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Тринадцатый V

Эфемер

Прокофьев Роман Юрьевич
7. Стеллар
Фантастика:
боевая фантастика
рпг
7.23
рейтинг книги
Эфемер

Я еще князь. Книга XX

Дрейк Сириус
20. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я еще князь. Книга XX

Низший - Инфериор. Компиляция. Книги 1-19

Михайлов Дем Алексеевич
Фантастика 2023. Компиляция
Фантастика:
боевая фантастика
5.00
рейтинг книги
Низший - Инфериор. Компиляция. Книги 1-19

Князь Целитель 4

Ткачев Андрей Юрьевич
4. Князь Целитель
Фантастика:
боевая фантастика
городское фэнтези
аниме
фэнтези
5.00
рейтинг книги
Князь Целитель 4

Шатун. Лесной гамбит

Трофимов Ерофей
2. Шатун
Фантастика:
боевая фантастика
7.43
рейтинг книги
Шатун. Лесной гамбит