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

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

Жанры

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

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
из предыдущего раздела определяет совершенно новый тип множеств и полностью переопределяет основные методы, наследуемые от суперкласса. Однако часто при определении подкласса необходимо лишь расширить или немного изменить поведение методов суперкласса, а не заменить их полностью. В этом случае конструктор и методы подкласса могут вызывать конструктор и методы базового класса.

Пример 9.13 демонстрирует применение этого приема. Он определяет подкласс

NonNullSet
класса
Set
: тип множеств, которые не могут содержать элементы со значениями
null
и
undefined
. Чтобы исключить возможность включения в множество таких элементов, класс
NonNullSet
должен выполнить в методе
add
проверку значений добавляемых элементов на равенство значениям
null
и
undefined
. Но при этом не требуется включать в класс полную реализацию метода
add
– можно просто вызвать версию метода из суперкласса. Обратите также внимание, что конструктор
NonNullSet
тоже не реализует все необходимые операции: он просто передает свои аргументы конструктору суперкласса (вызывая его как функцию, а не как конструктор), чтобы конструктор суперкласса мог инициализировать вновь созданный объект.

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

/*

* NonNullSet - подкласс класса Set, который не может содержать элементы

* со значениями null и undefined.

*/

function NonNullSet {

// Простое обращение к суперклассу.

// Вызвать конструктор суперкласса как обычную функцию для инициализации

// объекта, который был создан вызовом этого конструктора.

Set.apply(this, arguments);

}

// Сделать класс NonNullSet подклассом класса Set:

NonNullSet.prototype = inherit(Set.prototype);

NonNullSet.prototype.constructor = NonNullSet;

// Чтобы исключить возможность добавления значений null и undefined,

// достаточно переопределить метод add

NonNullSet.prototype.add = function {

// Проверить наличие аргументов со значениями null и undefined

for(var і = 0; і < arguments.length; i++)

if (arguments[i] == null)

throw new Еrror("Нельзя добавить null или undefined в NonNullSet”);

// Вызвать метод базового суперкласса, чтобы фактически добавить элементы

return Set.prototype.add.apply(this, arguments);

};

Теперь обобщим понятие "множество без пустых элементов" до понятия "фильтрованное множество": множество, элементы которого должны пропускаться через функцию-фильтр перед добавлением. Определим фабричную функцию (подобную функции

enumeration
) из примера 9.7), которая будет получать функцию-фильтр и возвращать новый подкласс класса
Set
. В действительности можно пойти еще дальше по пути обобщений и определить фабричную функцию, принимающую два аргумента: наследуемый класс и функцию-фильтр, применяемую к методу
add.
Новой фабричной функции можно было бы дать имя
filteredSetSubclass
и использовать ее, как показано ниже:

// Определить класс множеств, которые могут хранить только строки

var StringSet = filteredSetSubclass(Set,

function(x) {return typeof x===*'string";});

// Определить класс множеств, которые не могут содержать значения null,

// undefined и функции

var MySet = filteredSetSubclass(NonNullSet,

function(x) {return typeof x !== "function";});

Реализация этой фабричной функции приводится в примере 9.14. Обратите внимание, что эта функция вызывает метод и конструктор базового класса подобно тому, как это реализовано в классе

NonNullSet
.

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

/*

* Эта функция возвращает подкласс указанного класса Set и переопределяет

* метод add этого класса, применяя указанный фильтр.

*/

function filteredSetSubclass(superclass, filter) {

var constructor = function { // Конструктор подкласса

superclass.apply(this, arguments); // Вызов конструктора базового класса

};

var proto = constructor.prototype = inherit(superclass.prototype);

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

Корпорация М.И.Ф. (сборник)

Асприн Роберт Линн
Фантастика:
юмористическая фантастика
8.79
рейтинг книги
Корпорация М.И.Ф. (сборник)

Цикл романов "Целитель". Компиляция. Книги 1-17

Большаков Валерий Петрович
Целитель
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Цикл романов Целитель. Компиляция. Книги 1-17

Наследие Маозари 2

Панежин Евгений
2. Наследие Маозари
Фантастика:
попаданцы
рпг
аниме
5.00
рейтинг книги
Наследие Маозари 2

Наследник

Шимохин Дмитрий
1. Старицкий
Приключения:
исторические приключения
5.00
рейтинг книги
Наследник

Черный маг императора 2

Герда Александр
2. Черный маг императора
Фантастика:
юмористическая фантастика
попаданцы
аниме
6.00
рейтинг книги
Черный маг императора 2

Атаман. Гексалогия

Корчевский Юрий Григорьевич
Фантастика:
попаданцы
альтернативная история
историческое фэнтези
8.15
рейтинг книги
Атаман. Гексалогия

Старый, но крепкий 9

Крынов Макс
9. Культивация без насилия
Фантастика:
рпг
уся
фэнтези
сянься
5.00
рейтинг книги
Старый, но крепкий 9

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

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

Кодекс Охотника. Книга XXIV

Винокуров Юрий
24. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XXIV

Кондотьер

Листратов Валерий
7. Ушедший Род
Фантастика:
фэнтези
боевая фантастика
аниме
попаданцы
5.00
рейтинг книги
Кондотьер

Наследник

Майерс Александр
3. Династия
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Наследник

Алекс и Алекс

Афанасьев Семен
1. Алекс и Алекс
Фантастика:
боевая фантастика
6.83
рейтинг книги
Алекс и Алекс

Черный Маг Императора 15

Герда Александр
15. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
сказочная фантастика
фэнтези
фантастика: прочее
5.00
рейтинг книги
Черный Маг Императора 15

Кодекс Охотника. Книга XXVII

Винокуров Юрий
27. Кодекс Охотника
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Кодекс Охотника. Книга XXVII