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

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

Жанры

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

var Coin = enumeration({Penny: 1, Nickel:5, Dime:10, Quarter:25});

var c = Coin.Dime; // Это экземпляр нового класса

с instanceof Coin // => true: instanceof работает

c.constructor == Coin // => true: свойство constructor работает

Coin.Quarter + 3*Coin.Nickel // => 40: значения преобразуются в числа

Coin.Dime == 10 // => true:
еще одно преобразование в число

Coin.Dime > Coin.Nickel // => true: операторы отношения работают

String(Coin.Dime) + ":" + Coin.Dime // => "Dime:10": преобразов, в строку

Цель этого примера состоит в том, чтобы продемонстрировать, что классы в языке JavaScript являются более гибкими и динамичными, чем статические классы в таких языках, как C++ и Java.

Пример 9.7 Типы-перечисления в JavaScript

// Эта функция создает новый тип-перечисление. Объект в аргументе определяет

// имена и значения каждого экземпляра класса. Возвращает функцию-конструктор,

// идентифицирующую новый класс. Отметьте, однако, что конструктор возбуждает

// исключение: его нельзя использовать для создания новых экземпляров типа.

// Возвращаемый конструктор имеет свойства, которые отображают имена в значения,

// а также массив значений values и функцию foreach для выполнения итераций

function enumeration(namesToValues) {

// Фиктивный конструктор, который будет использоваться как

// возвращаемое значение.

var enumeration = function { throw "Нельзя создать экземпляр класса” +

Enumeration"; };

// Перечислимые значения наследуют объект this,

var proto = enumeration.prototype = {

constructor: enumeration, // Идентификатор типа

toString: function { return this.name; }, // Возвращает имя

valueOf: function { return this.value; }, // Возвращает значение

toJSON: function { return this.name; } // Для сериализации

};

enumeration.values = []; // Массив перечислимых объектов-значений

// Теперь создать экземпляры нового типа.

for(name in namesToValues) { // Для каждого значения

var
е = inherit(proto); // Создать объект для его представления

e.name = name; // Дать ему имя

е.value = namesToValues[name]; // И значение

enumeration[name] = е; // Сделать свойством конструктора

enumeration.values.push(e); // И сохранить в массиве values

}

// Метод класса для обхода экземпляров класса в цикле

enumeration.foreach = function(f,с) {

for(var і = 0; і < this.values.length; i++) f.call(c,this.values[i]);

};

// Вернуть конструктор, идентифицирующий новый тип

return enumeration;

}

Типичным начальным примером использования типов-перечислений может служить реализация перечисления для представления колоды игральных карт. Пример 9.8 использует функцию enumeration) именно для этого, а также определяет классы для представления карт и колод карт. [16]

16

Этот пример основан на примере для языка Java, написанном Джошуа Блохом (Joshua Bloch) и доступном по адресу:

Пример 9.8. Представление игральных карт в виде типов-перечислений

// Определение класса для представления игральной карты

function Card(suit, rank) {

this.suit = suit; // Каждая карта имеет масть

this.rank = rank; // и значение

}

// Следующие типы-перечисления определяют возможные масти и значения карт

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

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

Seven: 7, Eight: 8, Nine: 9, Ten: 10,

Jack: 11, Queen: 12, King: 13, Ace: 14});

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

Card.prototype.toString = function {

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

Воронцов. Перезагрузка

Тарасов Ник
1. Воронцов. Перезагрузка
Фантастика:
попаданцы
альтернативная история
фантастика: прочее
5.50
рейтинг книги
Воронцов. Перезагрузка

Политическая история Римской империи

Циркин Юлий Беркович
Историческая библиотека
Научно-образовательная:
история
5.00
рейтинг книги
Политическая история Римской империи

Я - обычный

Жеребьев Владислав Юрьевич
Фантастика:
боевая фантастика
ужасы и мистика
7.17
рейтинг книги
Я - обычный

Курс 1. Сентябрь

Фокс Гарри
1. Маркатис
Фантастика:
аниме
фэнтези
сказочная фантастика
5.00
рейтинг книги
Курс 1. Сентябрь

Адепт

Листратов Валерий
4. Ушедший Род
Фантастика:
попаданцы
аниме
фэнтези
5.25
рейтинг книги
Адепт

Точка Бифуркации III

Смит Дейлор
3. ТБ
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Точка Бифуркации III

Неудержимый. Книга II

Боярский Андрей
2. Неудержимый
Фантастика:
городское фэнтези
попаданцы
5.00
рейтинг книги
Неудержимый. Книга II

Немецкие танки в бою

Барятинский Михаил Борисович
1. Танки в бою
Документальная литература:
прочая документальная литература
5.75
рейтинг книги
Немецкие танки в бою

Я спас СССР! том 2

Вязовский Алексей
2. Я спас СССР
Фантастика:
альтернативная история
5.62
рейтинг книги
Я спас СССР! том 2

Третий. Том 3

INDIGO
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.25
рейтинг книги
Третий. Том 3

Периферийная империя: циклы русской истории

Кагарлицкий Борис Юльевич
Политический бестселлер
Научно-образовательная:
история
политика
5.00
рейтинг книги
Периферийная империя: циклы русской истории

Кar

Санивский Сергей Анатолиевич
5.00
рейтинг книги
Кar

Статьи в журнале "Русская Жизнь"(v.1.1)

Кагарлицкий Борис Юльевич
Научно-образовательная:
политика
5.00
рейтинг книги
Статьи в журнале Русская Жизнь(v.1.1)

Мать (CИ)

Волобуев Вадим
5.00
рейтинг книги
Мать (CИ)