Вход/Регистрация
JavaScript. Подробное руководство, 6-е издание
вернуться

Флэнаган Дэвид

Шрифт:

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:

SingletonSet.prototype.equals = function(that) {

return that instanceof Set && that.size==1 && that.contains(this.member);

};

Обратите внимание, что класс

SingletonSet
не просто заимствует список методов из класса
Set
: он динамически наследует методы класса
Set
. Если в
Set.prototype
добавить новый метод, он тут же станет доступен всем экземплярам классов
Set
и
SingletonSet
(в предположении, что класс
SingletonSet
не определяет собственный метод с таким же именем).

9.7.2. Вызов конструктора и методов базового класса

Класс

SingletonSet
из предыдущего раздела определяет совершенно новый тип множеств и полностью переопределяет основные методы, наследуемые от суперкласса. Однако часто при определении подкласса необходимо лишь расширить или немного изменить поведение методов суперкласса, а не заменить их полностью. В этом случае конструктор и методы подкласса могут вызывать конструктор и методы базового класса.

  • Читать дальше
  • 1
  • ...
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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