// Вспомогательная функция, которая может использоваться для определения
// любого абстрактного метода
function abstractmethod() { throw new Error("абстрактный метод"); }
/*
* Класс AbstractSet определяет единственный абстрактный метод, contains().
*/
function AbstractSet() {
throw new Error("Нельзя создать экземпляр абстрактного класса");
}
AbstractSet.prototype.contains = abstractmethod;
/*
* NotSet - конкретный подкласс класса AbstractSet.
* Элементами этого множества являются все значения, которые не являются
* элементами некоторого другого множества. Поскольку это множество
* определяется в терминах другого множества, оно не доступно для записи,
* а так как оно имеет бесконечное число элементов, оно недоступно для перечисления.
* Все, что позволяет этот класс, - это проверить принадлежность к множеству.
* Обратите внимание, что для определения этого подкласса используется метод
* Function.prototype.extend(), объявленный выше.
*/
var NotSet = AbstractSet.extend(
function NotSet(set) { this.set = set; },
{
contains: function(x) { return !this.set.contains(x); },
toString: function(x) { return "~" + this.set.toString(); },
equals: function(that) {
return that instanceof NotSet && this.set.equals(that.set);
}
}
);
// Простая функция для создания простых подклассов
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;
}
// То же самое можно реализовать в виде метода конструктора суперкласса
Function.prototype.extend = function(constructor, methods, statics) {
return defineSubclass(this, constructor, methods, statics);
};
Почему в this.set.equals
передается that.set
, а не просто that
.
Ранее свойство set определенно не было. Пример из книги Фленагана 259 с.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Как сделать чтобы при нажатии на кнопку спускалось вниз там где начинается определенный раздел(название кнопки=название раздела)?
Есть скрипт, который ограничивает кол-во вводных символов до 3х и разрешены только цифры