В этом разделе представлен расширенный пример модуля, содержащего функ_ ции для работы с модулями. Функция Module.createNamespace() создает простран_ ство имен и выполняет проверку на наличие ошибок. Автор модуля может ис_ пользовать эту функцию следующим образом:
// Создать пространство имен модуля Module.createNamespace("com.davidflanagan.Class");
// Заполнить это пространство
com.davidflanagan.Class.define = function(data) { /* тело функции */ }; com.davidflanagan.Class.provides = function(o, c) { /* тело функции */ };
Функция Module.require() проверяет присутствие заданной (или более поздней) версии модуля и возбуждает исключение, если он отсутствует. Используется она следующим образом:
// Модуль Complex требует, чтобы предварительно был загружен модуль Class Module.require("com.davidflanagan.Class", 1.0);
Функция Module.importSymbols() упрощает задачу импорта символов в глобальное пространство имен или любое другое заданное пространство имен. Вот пример ее использования:
// Импортировать символы по умолчанию модуля Module в глобальное пространство имен
// Одним из таких символов по умолчанию является сама функция importSymbols Module.importSymbols(Module); // Отметьте, что мы передаем пространство
// имен, а не имя модуля
// Импортировать класс Complex в глобальное пространство имен importSymbols(com.davidflanagan.Complex);
// Импортировать метод com.davidflanagan.Class.define() в объект Class
Наконец, функция Module.registerInitializationFunction() позволяет модулю за_ регистрировать функцию инициализации, которая будет запущена позднее.1 Когда эта функция используется в клиентском языке JavaScript, автоматически производится регистрация обработчика события, который по окончании загруз_ ки документа вызовет все функции инициализации всех загруженных модулей. В других (не клиентских) контекстах функции инициализации автоматически не вызываются, но есть возможность явно сделать это с помощью функции Modu_ le.runInitializationFunctions().
Исходные тексты модуля Module приводятся в примере 10.5. Этот пример доста_ точно длинный, но его детальное изучение окупит себя с лихвой. Подробное опи_ сание каждой функции есть в тексте примера.
1 Похожая функция регистрации функций инициализации приводится в приме_ ре 17.6.
10.3. Модуль со вспомогательными функциями
Пример 10.5. Модуль с функциями для обслуживания модулей
/**
* Module.js: Функции для работы с модулями и пространствами имен
*
* Этот модуль содержит функции для работы с модулями, которые
* совместимы с модулями из архива JSAN.
* Данный модуль определяет пространство имен Module.
*/
// Убедиться, что данный модуль еще не загружен var Module;
if (Module && (typeof Module != "object" || Module.NAME))
throw new Error("Пространство имен 'Module' уже существует");
// Создать собственное пространство имен
Module = {};
// Далее располагается метаинформация об этом пространстве имен Module.NAME = "Module"; // Название этого пространства имен Module.VERSION = 0.1; // Версия этого пространства имен
// Далее следует список общедоступных символов, которые будут
// экспортироваться этим пространством имен.
// Эта информация интересна тем, кто будет пользоваться модулем Module.EXPORT = ["require", "importSymbols"];
// Далее следует перечень символов, которые также будут экспортироваться.
// Но они, как правило, используются только авторами модулей