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

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

Шрифт:

toArray :
function {

var a = [];

this.foreach(function(v) { a.push(v); });

return a;

}

});

// Для нужд сериализации в формат JS0N интерпретировать множество как массив.

Set.prototype.toJSON = Set.prototype.toArray;

9.6.4. Методы сравнения

Операторы сравнения в языке JavaScript сравнивают объекты по ссылке, а не по значению. Так, если имеются две ссылки на объекты, то выясняется, ссылаются они на один и тот же объект или нет, но не выясняется, обладают ли разные объекты одинаковыми свойствами с одинаковыми значениями.[17] Часто бывает удобным иметь возможность сравнить объекты на равенство или определить порядок их следования (например, с помощью операторов отношения

<
и
>
). Если вы определяете новый класс и хотите иметь возможность сравнивать экземпляры этого класса, вам придется определить соответствующие методы, выполняющие сравнение.

В языке программирования Java сравнение объектов производится с помощью методов, и подобный подход можно с успехом использовать в JavaScript. Чтобы иметь возможность сравнивать экземпляры класса, можно определить метод экземпляра с именем equals. Этот метод должен принимать единственный аргумент и возвращать true, если аргумент эквивалентен объекту, метод которого был вызван. Разумеется, вам решать, что следует понимать под словом «эквивалентен» в контексте вашего класса. Для простых классов часто достаточно просто сравнить свойства constructor, чтобы убедиться, что оба объекта имеют один и тот-же тип, и затем сравнивать свойства экземпляра двух объектов, чтобы убедиться, что они имеют одинаковые значения. Класс

Complex
из примера 9.3 как раз обладает таким методом
equals,
и для нас не составит труда написать похожий метод для класса
Range
:

// Класс Range затирает свое свойство constructor. Поэтому восстановим его.

Range.prototype.constructor = Range;

// Объект Range не может быть равен никакому другому объекту, не являющемуся

// диапазоном значений. Два диапазона равны, только если равны значения их границ.

Range.prototype.equals = function(that) {

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, если множества не равны,

  • Читать дальше
  • 1
  • ...
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • ...

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

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

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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