Дэвид Флэнаган - JavaScript. Подробное руководство, 6-е издание
- Название:JavaScript. Подробное руководство, 6-е издание
- Автор:
- Жанр:
- Издательство:Символ-Плюс
- Год:2012
- Город:СПб
- ISBN:978-5-93286-215-5
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Дэвид Флэнаган - JavaScript. Подробное руководство, 6-е издание краткое содержание
Эта книга - одновременно и руководство программиста, и полноценный справочник по базовому языку JavaScript и клиентским прикладным интерфейсам, предоставляемым веб-броузерами.
JavaScript. Подробное руководство, 6-е издание - читать онлайн бесплатно ознакомительный отрывок
Интервал:
Закладка:
Set.prototype.foreach = function(f, context) {
for(var s in this.values) // Для каждой строки в множестве
if (this.values.hasOwnProperty(s)) // Пропустить унаследов. свойства
f.call(context. this.values[s]); // Вызвать f для значения
};
// Функция для внутреннего использования. Отображает любые значения JavaScript
// в уникальные строки.
Set._v2s = function(val) {
switch(val) {
case undefined: return 'u'; // Специальные простые значения
case null: return 'n'; // отображаются в односимвольные строки.
case true: return 't';
case false: return 'f;
default: switch(typeof val) {
case 'number': return + val; // Числа получают префикс #.
case 'string': return "" + val; // Строки получают префикс ".
default: return '@' + objectId(val); // Объекты и функции - @
}
}
// Для любого объекта возвращается строка. Для разных объектов эта функция
// будет возвращать разные строки, а для одного и того же объекта всегда
// будет возвращать одну и ту же строку. Для этого в объекте о создается свойство.
// В ES5 это свойство можно сделать неперечислимым и доступным только для чтения,
function objectld(o) {
var prop = "I **objectid**|”; // Имя частного идентификац. свойства
if (!о.hasOwnProperty(prop)) // Если объект не имеет этого свойства
о[ргор] = Set._v2s.next++; // Присвоить ему след, доступ, значение
return о[ргор]; // Вернуть идентификатор
}
};
Set._v2s.next = 100; // Начальное значение для идентификаторов объектов.
9.6.2. Пример: типы-перечисления
Перечислениями называются типы, которые могут принимать конечное количество значений, объявляемых (или «перечисляемых») при определении типа.
В языке С и его производных типы-перечисления объявляются с помощью ключевого слова enum
. В ECMAScript 5 enum
- это зарезервированное (но не используемое) слово, оставленное на тот случай, если когда-нибудь в JavaScript будут реализованы встроенные типы-перечисления. А пока в примере 9.7 демонстрируется, как можно определить собственный тип-перечисление на языке JavaScript. Обратите внимание, что здесь используется функция inherit()
из примера 6.1.
Пример 9.7 содержит единственную функцию enumeration().
Однако она не является конструктором: она не определяет класс с именем «enumeration». Но она является фабричной функцией: при каждом вызове она создает и возвращает новый класс. Ниже показано, как ее можно использовать:
// Создать новый класс Coin с четырьмя возможными значениями:
// Coin.Penny, Coin.Nickel и т. д.
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] Этот пример основан на примере для языка Java, написанном Джошуа Блохом (Joshua Bloch) и доступном по адресу: http://jcp.org/aboutJava/communityprocess/jsr/tiger/enum.html .)
Пример 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,
Интервал:
Закладка: