Добавить несколько объектов в пространство имен Javascript из разных файлов
Для пространств имен ns
, используемых в двух разных файлах:
abc.js
ns = ns || (function () {
foo = function() { ... };
return {
abc : foo
};
}());
def.js
// is this correct?
ns = ns || {}
ns.def = ns.def || (function () {
defoo = function () { ... };
return {
deFoo: defoo
};
}());
Правильно ли это добавить def
в ns
в пространство имен? Другими словами, как объединить два вклада в пространство имен в javascript?
Если abc.js
предшествует def.js
, я ожидаю, что это сработает. Если def.js
предшествует abc.js
, я бы ожидал, что ns.abc
не будет существовать, потому что в это время определено ns
.
Кажется, что должен быть шаблон проектирования, чтобы устранить любую неопределенность включения включений в шаблон пространства имен javascript.
Я был бы признателен за мысли и материалы о том, как лучше всего пойти на такое "включение".
Спасибо за чтение.
Брайан
Ответы
Ответ 1
Это, безусловно, сработает. Имейте в виду, однако, что исходный порядок повлияет на вашу реализацию: если def.js когда-либо включается до abc.js, ваше определение foo и ns.abc никогда не будет выполнено.
Посмотрите старую функцию пространства YUI для примера: они должны либо использовать существующий объект, либо инициализировать новый объект, возможно, для эта причина выше.
Это может очень помочь вам разделить ваши модули следующим образом:
ns = ns || {};
ns.abc = function(){ ... }();
and
ns = ns || {};
ns.def = function() ... }();
Таким образом, каждый из них является отдельным модулем, порядок источника не имеет значения, и каждый из них имеет доступ к своему закрытию, как в вашем примере.
Ответ 2
В качестве интереса я обнаружил AMD и RequireJS и начал использовать это.