Книга: JavaScript. Подробное руководство, 6-е издание
9.9.1. Объекты как пространства имен
9.9.1. Объекты как пространства имен
Один из способов обойтись в модуле без создания глобальных переменных заключается в том, чтобы создать объект и использовать его как пространство имен. Вместо того чтобы создавать глобальные функции и переменные, их можно сохранять в свойствах объекта (на который может ссылаться глобальная переменная). Рассмотрим в качестве примера класс Set
из примера 9.6. Он определяет единственную глобальную функцию-конструктор Set
. Он определяет различные методы экземпляров, но сохраняет их как свойства объекта Set.prototype
, благодаря чему они уже не являются глобальными. В этом примере также определяется вспомогательная функция _v2s(),
но она также сохраняется как свойство класса Set
.
Далее рассмотрим пример 9.16. Этот пример объявляет несколько абстрактных и конкретных классов множеств. Для каждого класса создается единственное глобальное имя, но модуль целиком (файл с программным кодом) определяет довольно много глобальных имен. С точки зрения сохранения чистоты глобального пространства имен было бы лучше, если бы модуль с классами множеств определял единственное глобальное имя:
var sets = {};
Объект sets
мог бы играть роль пространства имен модуля, а каждый из классов множеств определялся бы как свойство этого объекта:
sets.SingletonSet = sets.AbstractEnumerableSet.extend(...);
Когда возникла бы потребность использовать класс, объявленный таким способом, мы могли бы просто добавлять пространство имен при ссылке на конструктор:
var s = new sets.SingletonSet(1);
Автор модуля не может заранее знать, с какими другими модулями будет использоваться его модуль, поэтому он должен принять все меры против конфликтов, используя подобные пространства имен. Однако программист, использующий модуль, знает, какие модули он использует и какие имена в них определяются. Этот программист не обязан использовать имеющиеся пространства имен ограниченно и может импортировать часто используемые значения в глобальное пространство имен. Программист, который собирается часто использовать класс Set
из пространства имен sets
, мог бы импортировать класс, как показано ниже:
var Set = sets.Set; // Импортировать Set в глобальное пространство имен
var s = new Set(1,2,3); // Теперь его можно использовать без префикса sets.
Иногда авторы модулей используют глубоко вложенные пространства имен. Если модуль с определениями классов множеств является частью обширной коллекции модулей, для него может использоваться пространство имен collections
, sets
, а сам модуль может начинаться со следующих определений:
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.
- 3.3.5. Регистрация пространств имен
- 11.3.11. Обход пространства объектов
- Дополнительные пространства имен ADO.NET
- Ширина и глубина ассортимента
- ЧАСТЬ IV. База данных и ее объекты.
- Физические объекты
- Категорийный менеджмент. Курс управления ассортиментом в рознице
- Имена индексов ограничений
- Пример применения метода «пять почему»
- Имена объектов длиной 68 символов
- Ценовая сегментация ассортимента
- 5.12.2 Открытие поименованного канала