Пример 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; },
// Достаточно вызвать функцию один раз и передать ей единственный элемент,
// Метод 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
и не обязан иметь собственную реализацию этого метода. Безусловно, учитывая чрезвычайно упрощенную структуру множества, содержащего единственный элемент, можно было бы реализовать для класса