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

<b>  Card.Suit = enumeration({Clubs: 1, Diamonds: 2, Hearts:3, Spades:4});</b>

<b>  Card.Rank = enumeration({Two: 2, Three: 3, Four: 4, Five: 5, Six: 6,</b>

<b>                   Seven: 7, Eight: 8, Nine: 9, Ten: 10,</b>

<b>                   Jack: 11, Queen: 12, King: 13, Ace: 14});</b>

<b>// Определение текстового представления карты</b>

<b>Card.prototype.toString = function() {</b>

<b>  return this. rank.toString() + &quot; &quot; + this.suit.toString();</b>

<b>};</b>

<b>// Сравнивает значения двух карт в соответствии с правилами игры в покер</b>

<b>Card.prototype.compareTo = function(that){</b>

<b>  if (this.rank &lt; that.rank) return -1;</b>

<b>  if (this.rank &gt; that.rank) return 1;</b>

<b>  return 0;</b>

<b>};</b>

<b>// Функция упорядочения карт в соответствии с правилами игры в покер</b>

<b>Card.orderByRank = function(a,b) { return a.compareTo(b); };</b>

<b>// Функция упорядочения карт в соответствии с правилами игры в бридж</b>

<b>Card.orderBySuit = function(a,b) {</b>

<b>  if (a.suit &lt; b.suit) return -1;</b>

<b>  if (a.suit &gt; b.suit) return 1;</b>

<b>  if (a.rank &lt; b.rank) return -1;</b>

<b>  if (a.rank &gt; b.rank) return 1;</b>

<b>  return 0;</b>

<b>}:</b>

<b>// Определение класса представления стандартной колоды карт</b>

<b>function Deck() {</b>

<b>  var cards = this.cards = []; // Колода - просто массив карт</b>

<b>  Card.Suit.foreach(function(s) { // Инициализировать массив</b>

<b>    Card.Rank.foreach(function(r) {</b>

<b>      cards.push(new Card(s,r));</b>

<b>    })</b>

<b>  });</b>

<b>}</b>

<b>// Метод перемешивания: тасует колоду карт и возвращает ее</b>

<b>Deck.prototype.shuffle = function() {</b>

<b>  // Для каждого элемента массива: поменять местами</b>

<b>  // со случайно выбранным элементом ниже</b>

<b>  var deck = this.cards, len = deck.length;</b>

<b>  for(var і = len-1; і &gt; 0; і--) {</b>

<b>    var r = Math.floor(Math.random()*(i+1)), temp; // Случайное число </b>

<b>    temp = deck[i], deck[i] = deck[r], deck[r] = temp; // Поменять</b>

<b>  }</b>

<b>  return this;</b>

<b>}</b>

<b>// Метод раздачи: возвращает массив карт</b>

<b>Deck.prototype.deal = function(n) {</b>

<b>  if (this.cards.length &lt; n) throw &quot;Карт для выдачи не хватает&quot;;</b>

<b>    return this.cards.splice(this.cards.length-n, n);</b>

<b>// Создает новую колоду карт, тасует ее и раздает как в игре в бридж</b>

<b>var deck = (new Deck()).shuffle();</b>

<b>var hand = deck.deal(13).sort(Card.orderBySuit);</b>

9.6.3. Стандартные методы преобразований

В разделах 3.8.3 и 6.10 описываются важные методы, используемые для преобразования типа объектов, часть из которых автоматически вызывается интерпретатором JavaScript по мере необходимости. Вам не обязательно определять эти методы в каждом своем классе, но они играют важную роль, и если вы отказываетесь от их реализации в своих классах, это должен быть осознанный выбор, а не простая оплошность.

Первым и наиболее важным является метод

<b>toString()</b>
. Назначение этого метода в том, чтобы возвращать строковое представление объекта. Интерпретатор JavaScript автоматически вызывает этот метод, когда объект используется там, где ожидается строка - в качестве имени свойства, например, или с оператором
<b>+</b>
, выполняющим конкатенацию строк. Если отказаться от реализации этого метода, ваш класс унаследует от
<b>Object.prototype</b>
реализацию по умолчанию и будет преобразовываться в довольно бесполезную строку «[object Object]». Метод
<b>toString()</b>
может возвращать более удобочитаемую строку, подходящую для отображения на экране перед конечным пользователем вашего приложения. Однако даже если в этом нет необходимости, часто бывает полезно определить свой метод
<b>toString(),</b>
чтобы упростить отладку. Классы
<b>Range </b>
и
<b>Complex</b>
, представленные в примерах 9.2 и 9.3, имеют собственные реализации метода
<b>toString(),</b>
как и типы-перечисления, реализация которых приводится в примере 9.7. Ниже мы определим метод,
<b>toString()</b>
для класса
<b>Set</b>
из примера 9.6.

С методом

<b>toString()</b>
тесно связан метод
<b>toLocaleString()</b>
: он должен преобразовывать объект в строку с учетом региональных настроек. По умолчанию объекты наследуют метод
<b>toLocaleString(),</b>
который просто вызывает их метод
<b>toString().</b>
Некоторые встроенные типы имеют более полезные реализации метода
<b>toLocaleString(),</b>
которые возвращают строки с учетом региональных настроек. Если в реализации своего метода
<b>toString()</b>
вам придется преобразовывать в строки другие объекты, вы также должны определить свой метод
<b>toLocaleString(),</b>
выполняющий те же преобразования вызовом метода
<b>toLocaleString()</b>
объектов. Ниже мы реализуем этот метод для класса
<b>Set</b>
.