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

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

Жанры

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 отсутствуют инструменты управления модулями, вам придется использовать средства создания и экспортирования модулей, которые лучше подходят для используемой вами библиотеки инструментов.

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

Кодекс Охотника. Книга X

Винокуров Юрий
10. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
6.25
рейтинг книги
Кодекс Охотника. Книга X

Ботаник 2

Щепетнов Евгений Владимирович
2. Ботаник
Фантастика:
фэнтези
боевая фантастика
6.00
рейтинг книги
Ботаник 2

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

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

Лекарь

Назимов Константин Геннадьевич
2. Травник
Фантастика:
фэнтези
5.25
рейтинг книги
Лекарь

Источник

Билик Дмитрий Александрович
11. Бедовый
Фантастика:
юмористическое фэнтези
городское фэнтези
мистика
7.00
рейтинг книги
Источник

Легат

Прокофьев Роман Юрьевич
6. Стеллар
Фантастика:
боевая фантастика
рпг
6.73
рейтинг книги
Легат

Второй кощей

Билик Дмитрий Александрович
8. Бедовый
Фантастика:
юмористическое фэнтези
городское фэнтези
мистика
5.00
рейтинг книги
Второй кощей

Моров. Том 1 и Том 2

Кощеев Владимир
1. Моров
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Моров. Том 1 и Том 2

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

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

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

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

Дважды одаренный

Тарс Элиан
1. Дважды одаренный
Фантастика:
альтернативная история
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Дважды одаренный

Простолюдин

Рокотов Алексей
1. Путь князя
Фантастика:
боевая фантастика
рпг
5.00
рейтинг книги
Простолюдин

Третий

INDIGO
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
Третий

Мастер 3

Чащин Валерий
3. Мастер
Фантастика:
героическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Мастер 3