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

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

Жанры

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

var collections; // Объявить (или повторно объявить) глобальную переменную

if (!collections) // Если объект еще не существует

collections = {}; // Создать объект пространства имен верхнего уровня

collections.sets = {} //И внутри него создать пространство имен sets.

// Теперь определить классы множеств внутри
collections.sets

collections.sets.AbstractSet = function { ... }

Иногда пространство имен верхнего уровня используется для идентификации разработчика или организации - автора модуля и для предотвращения конфликтов между пространствами имен. Например, библиотека Google Closure определяет свой класс

Set
в пространстве имен
goog.structs
. Для определения глобально уникальных префиксов, которые едва ли будут использоваться другими авторами модулей, индивидуальные разработчики могут использовать компоненты доменного имени. Поскольку мой вебсайт имеет имя
davidflanagan.com
, я мог бы поместить свой модуль с классами множеств в пространство имен
com.davidflanagan.collections.sets
.

При таких длинных именах для любого пользователя вашего модуля операция импортирования становится особенно важной. Однако, вместо того чтобы импортировать имена отдельных классов, программист мог бы импортировать в глобальное пространство имен весь модуль целиком:

var sets = com.davidflanagan.collections.sets;

В соответствии с соглашениями имя файла модуля должно совпадать с его пространством имен. Модуль

sets
должен храниться в файле с именем
sets.js
. Если модуль использует пространство имен
collections.sets
, то этот файл должен храниться в каталоге collections/ (этот каталог мог бы также включать файл maps.js). А модуль, использующий пространство имен
com.davidflanagan.collections.sets
, должен храниться в файле com/davidflanagan/collections/sets.js.

9.9.2. Область видимости функции как частное пространство имен

Модули имеют экспортируемый ими общедоступный прикладной интерфейс (API): это функции, классы, свойства и методы, предназначенные для использования другими программистами. Однако зачастую для внутренних нужд модуля требуются дополнительные функции или методы, которые не предназначены для использования за пределами модуля. Примером может служить функция

Set._v2s
из примера 9.6 - для нас было бы нежелательно, чтобы пользователи класса
Set
вызывали эту функцию, поэтому было бы неплохо сделать ее недоступной извне.

Этого можно добиться, определив модуль (в данном случае класс

Set
) внутри функции. Как описывалось в разделе 8.5, переменные и функции, объявленные внутри другой функции, являются локальными по отношению к этой функции и недоступны извне. Таким образом, область видимости функции (называемой иногда «функцией модуля») можно использовать как частное пространство имен модуля. Пример 9.24 демонстрирует, как это может выглядеть применительно к нашему классу
Set
.

Пример 9.24. Класс Set внутри функции модуля

// Объявляет глобальную переменную Set и присваивает ей значение, возвращаемое

// функцией. Круглые скобки, окружающие объявление функции, свидетельствуют о том,

// что функция будет вызвана сразу после ее объявления и что присваивается значение,

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

// определения функции, а не инструкция, поэтому наличие имени "invocation"

// не вызывает создание глобальной переменной,

var Set = (function invocation {

function Set { // Эта функция-конструктор - локальная переменная,

this.values = {}; // Свойство для хранения множества

this.n = 0; // Количество значений в множестве

this.add.apply(this, arguments); // Все аргументы являются значениями,

} // добавляемыми в множество

// Далее следуют определения методов в Set.prototype.

// Для экономии места программный код опущен

Set.prototype.contains = function(value) {

// Обратите внимание, что v2s вызывается без префикса Set._v2s

return this.values.hasOwnProperty(v2s(value));

};

Set.prototype.size = function { return this.n; };

Set.prototype.add = function { /* ... */ };

Set.prototype.remove = function { /* ... */ };

Set.prototype.foreach = function(f, context) {/*...*/>;

// Далее следуют вспомогательные функции и переменные, используемые

// методами выше. Они не являются частью общедоступного API модуля и скрыты

// в области видимости функции, благодаря чему не требуется объявлять их как

// свойства класса Set или использовать символ подчеркивания в качестве префикса.

function v2s(val) { /* ... */ }

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

Кадет Морозов

Шелег Дмитрий Витальевич
4. Живой лёд
Фантастика:
боевая фантастика
5.72
рейтинг книги
Кадет Морозов

Царь царей

Билик Дмитрий Александрович
9. Бедовый
Фантастика:
фэнтези
мистика
5.00
рейтинг книги
Царь царей

Вернуть невесту. Ловушка для попаданки 2

Ардова Алиса
2. Вернуть невесту
Любовные романы:
любовно-фантастические романы
7.88
рейтинг книги
Вернуть невесту. Ловушка для попаданки 2

S-T-I-K-S. Пройти через туман

Елисеев Алексей Станиславович
Вселенная S-T-I-K-S
Фантастика:
боевая фантастика
7.00
рейтинг книги
S-T-I-K-S. Пройти через туман

Монстр из прошлого тысячелетия

Еслер Андрей
5. Соприкосновение миров
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Монстр из прошлого тысячелетия

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

Борзых М.
12. РОС: Кодекс Крови
Фантастика:
боевая фантастика
попаданцы
5.00
рейтинг книги
Кодекс Крови. Книга ХII

Автобиография

Твен Марк
Документальная литература:
биографии и мемуары
6.25
рейтинг книги
Автобиография

Вторая жизнь майора. Цикл

Сухинин Владимир Александрович
Вторая жизнь майора
Фантастика:
героическая фантастика
боевая фантастика
попаданцы
5.00
рейтинг книги
Вторая жизнь майора. Цикл

Воин-Врач

Дмитриев Олег
1. Воин-Врач
Фантастика:
попаданцы
альтернативная история
историческое фэнтези
6.00
рейтинг книги
Воин-Врач

Хроники Тириса. Книга 3

Маханенко Василий Михайлович
3. Хроники Тириса
Фантастика:
боевая фантастика
космическая фантастика
фантастика: прочее
5.00
рейтинг книги
Хроники Тириса. Книга 3

Запечатанный во тьме. Том 2

NikL
2. Хроники Арнея
Фантастика:
уся
эпическая фантастика
фэнтези
5.00
рейтинг книги
Запечатанный во тьме. Том 2

Эволюционер из трущоб

Панарин Антон
1. Эволюционер из трущоб
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Эволюционер из трущоб

Искатель 1

Шиленко Сергей
1. Валинор
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Искатель 1

Газлайтер. Том 1

Володин Григорий
1. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Газлайтер. Том 1