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

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

Жанры

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

if (that == null) return false; // Отвергнуть null и undefined

if (that.constructor !== Range) return false; // Отвергнуть не диапазоны

// Вернуть true, если значения границ равны.

return this.from == that.from && this.to == that.to;

}

Задание метода

equals
для нашего класса
Set
оказывается несколько сложнее. Мы не можем просто сравнить свойства values двух множеств - требуется выполнить глубокое сравнение:

Set.prototype.equals = function(that) {

// Сокращенная проверка для тривиального случая

if (this === that) return true;

// Если объект that не является множеством, он не может быть равен объекту this.

// Для поддержки подклассов класса Set используется оператор instanceof.

// Мы могли бы реализовать более либеральную проверку, если бы для нас

// было желательно использовать прием грубого определения типа.

// Точно так же можно было бы ужесточить проверку, выполняя сравнение

// this.constructor == that.constructor.

// Обратите внимание, что оператор instanceof корректно отвергает попытки

// сравнения со значениями null и undefined

if (!(that instanceof Set)) return false;

// Если два множества имеют разные размеры, они не равны

if(this.size ! = that.size) return false;

// Теперь требуется убедиться, что каждый элемент в this также присутствует в that.

// Использовать исключение для прерывания цикла fоreach, если множества не равны,

try {

this.foreach(function(v) {
if(!that.contains(v)) throw false; });

return true; // Все элементы совпали: множества равны.

} catch (х) {

if (х === false) return false; // Элемент в this отсутствует в that,

throw x; // Для других исключений: возбудить повторно.

}

}:

Иногда бывает полезно реализовать операции сравнения, чтобы выяснить порядок следования объектов. Так, для некоторых классов вполне можно сказать, что один экземпляр «меньше» или «больше» другого. Например, объекты Range можно упорядочивать, опираясь на значение нижней границы. Типы-перечисления можно было бы упорядочивать в алфавитном порядке по именам или в числовом порядке - по значениям, присваиваемым именам (предполагается, что именам присваиваются числовые значения). С другой стороны, объекты класса Set не имеют какого-то естественного порядка следования.

При попытке сравнения объектов с помощью операторов отношения, таких как

<
и
<=
, интерпретатор сначала вызовет методы
valueOf
объектов и, если методы вернут значения простых типов, сравнит эти значения. Типы-перечисления, возвращаемые методом
enumeration
из примера 9.7, имеют метод
valueOf
и могут сравниваться с помощью операторов отношения. Однако большинство классов не имеют метода
valueOf
. Чтобы сравнивать объекты этих типов для выяснения порядка их следования по вашему выбору, необходимо (опять же, следуя соглашениям, принятым в языке программирования Java) реализовать метод с именем
compareTo.

Метод

compareTo
должен принимать единственный аргумент и сравнивать его с объектом, метод которого был вызван. Если объект
this
меньше, чем объект, представленный аргументом, метод
compareTo
должен возвращать значение меньше нуля. Если объект
this
больше, чем объект, представленный аргументом, метод должен возвращать значение больше нуля. И если оба объекта равны, метод должен возвращать ноль. Эти соглашения о возвращаемом значении весьма важны, потому что позволяют выполнять замену операторов отношения следующими выражениями:

Класс

Card
в примере 9.8 определяет подобный метод
compareTo,
и мы можем написать похожий метод для класса
Range
, чтобы упорядочивать диапазоны по их нижним границам:

Range.prototype.compareTo = function(that) {

return this.from - that.from;

};

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

Range
. Поскольку перечисление
Card.Rank
в примере 9.8 имеет метод
valueOf,
мы могли бы использовать тот же прием и в методе
сотраreTo
класса
Card
.

Методы

equals,
представленные выше, выполняют проверку типов своих аргументов и возвращают
false
, как признак неравенства, если аргументы имеют не тот тип. Метод
compareTo
не имеет специального возвращаемого значения, с помощью которого можно было бы определить, что «эти два значения не могут сравниваться», поэтому обычно методы
compareTo
возбуждают исключение при передаче им аргументов неверного типа.

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

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

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

Убивать чтобы жить 2

Бор Жорж
2. УЧЖ
Фантастика:
героическая фантастика
боевая фантастика
рпг
5.00
рейтинг книги
Убивать чтобы жить 2

Стеллар. Заклинатель

Прокофьев Роман Юрьевич
3. Стеллар
Фантастика:
боевая фантастика
8.40
рейтинг книги
Стеллар. Заклинатель

Камень. Книга шестая

Минин Станислав
6. Камень
Фантастика:
боевая фантастика
7.64
рейтинг книги
Камень. Книга шестая

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

Винокуров Юрий
14. Кодекс Охотника
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XIV

Родословная. Том 5

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

Повелители сумерек

Первушина Елена Владимировна
Фантастика:
фэнтези
ужасы и мистика
юмористическая фантастика
детективная фантастика
6.00
рейтинг книги
Повелители сумерек

Неучтенный элемент. Том 12

NikL
12. Антимаг. Вне системы
Фантастика:
фэнтези
5.00
рейтинг книги
Неучтенный элемент. Том 12

На границе империй. Том 10. Часть 8

INDIGO
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 10. Часть 8

Евангелие от зверя

Головачев Василий Васильевич
Шедевры отечественной фантастики
Фантастика:
фэнтези
альтернативная история
4.57
рейтинг книги
Евангелие от зверя

Армагед-дом

Дяченко Марина и Сергей
Фантастика:
социально-философская фантастика
альтернативная история
8.40
рейтинг книги
Армагед-дом

Реванш

СветочкаN
Фантастика:
фэнтези
5.00
рейтинг книги
Реванш

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

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

Кодекс Крови. Книга ХVI

Борзых М.
16. РОС: Кодекс Крови
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Кодекс Крови. Книга ХVI