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

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

Жанры

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

function objectld(o) { /* ... */ }

var nextId = 1;

// Общедоступным API этого модуля является функция-конструктор Set.

// Нам необходимо экспортировать эту функцию за пределы частного

// пространства имен, чтобы ее можно было использовать за ее пределами.

// В данном случае конструктор экспортируется за счет передачи его

// в виде возвращаемого значения. Он становится присваиваемым значением

// в выражении в первой строке выше, return Set;

}); // Вызвать функцию сразу после ее объявления.

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

«(function {
» и завершается «
});
». Открывающая круглая скобка в начале сообщает интерпретатору, что это выражение определения функции, а не инструкция, поэтому в префикс можно добавить любое имя функции, поясняющее ее назначение. В примере 9.24 было использовано имя «
invocation
», чтобы подчеркнуть, что функция вызывается сразу же после ее объявления. Точно так же можно было бы использовать имя «
namespace
», чтобы подчеркнуть, что функция играет роль пространства имен.

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

// Создает единственную глобальную переменную, хранящую все модули,

// имеющие отношение к коллекциям

var collections;

if (!collections) collections = {};

// Теперь определить модуль sets

collections.sets = (function namespace {

// Здесь находятся определения различных классов множеств,

// использующих локальные переменные и функции

// ... Большая часть программного кода опущена...

// Экспортировать API в виде возвращаемого объекта пространства имен

return {

// Экспортируемое имя свойства : имя локальной переменной

AbstractSet: AbstractSet,

NotSet: NotSet,

AbstractEnumerableSet: AbstractEnumerableSet,

SingletonSet: SingletonSet,

AbstractWritableSet: AbstractWritableSet,

ArraySet: ArraySet

};

});

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

new
и экспортировать значения за счет их присваивания:

var collections;

if (!collections) collections = {};

collections.sets = (new function namespace {

// ... Большая часть программного кода опущена ...

// Экспортировать API в объекте this

this.AbstractSet = AbstractSet;

this.NotSet = NotSet; // И так далее...

// Обратите внимание на отсутствие возвращаемого значения.

});

Если объект глобального пространства имен уже определен, функция модуля может просто присваивать значения свойствам этого объекта и вообще ничего не возвращать:

var collections;

if (!collections) collections = {};

collections.sets = {};

(function namespace {

// ... Большая часть программного кода опущена ...

// Экспортировать общедоступный API в объект пространства имен, созданный выше

collections.sets.AbstractSet = AbstractSet;

collections.sets.NotSet = NotSet; // И так далее...

// Инструкция return не требуется, потому что экспортирование выполняется выше.

});

Фреймворки, реализующие инструменты загрузки модулей, могут предусматривать собственные методы экспортирования API модулей. Внутри модуля может определяться функция

provides,
которая выполняет регистрацию его API, или объект
exports
, в котором модуль должен сохранять свой API. Пока в языке JavaScript отсутствуют инструменты управления модулями, вам придется использовать средства создания и экспортирования модулей, которые лучше подходят для используемой вами библиотеки инструментов.

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

Наследие Маозари 9

Панежин Евгений
9. Наследие Маозари
Фантастика:
попаданцы
постапокалипсис
рпг
сказочная фантастика
6.25
рейтинг книги
Наследие Маозари 9

Черный рынок

Вайс Александр
6. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
космоопера
5.00
рейтинг книги
Черный рынок

Идеальный мир для Лекаря

Сапфир Олег
1. Лекарь
Фантастика:
фэнтези
юмористическое фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря

Убивать чтобы жить 3

Бор Жорж
3. УЧЖ
Фантастика:
героическая фантастика
боевая фантастика
рпг
5.00
рейтинг книги
Убивать чтобы жить 3

Антимаг

Гедеон Александр и Евгения
1. Антимаг
Фантастика:
фэнтези
6.95
рейтинг книги
Антимаг

Бастард Императора. Том 9

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

Хозяин Стужи

Петров Максим Николаевич
1. Злой Лед
Фантастика:
аниме
фэнтези
попаданцы
7.00
рейтинг книги
Хозяин Стужи

Стеллар. Трибут

Прокофьев Роман Юрьевич
2. Стеллар
Фантастика:
боевая фантастика
рпг
8.75
рейтинг книги
Стеллар. Трибут

Потомок бога

Решетов Евгений Валерьевич
1. Локки
Фантастика:
попаданцы
альтернативная история
аниме
сказочная фантастика
5.00
рейтинг книги
Потомок бога

Я уже барон

Дрейк Сириус
2. Дорогой барон!
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Я уже барон

Эпоха Опустошителя. Том VI

Павлов Вел
6. Вечное Ристалище
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Эпоха Опустошителя. Том VI

В лапах зверя

Зайцева Мария
1. Звериные повадки Симоновых
Любовные романы:
остросюжетные любовные романы
эро литература
5.00
рейтинг книги
В лапах зверя

Путёвка в спецназ

Соколов Вячеслав Иванович
1. Мажор
Фантастика:
боевая фантастика
7.55
рейтинг книги
Путёвка в спецназ

Страж Кодекса. Книга V

Романов Илья Николаевич
5. КО: Страж Кодекса
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Страж Кодекса. Книга V