Добавить несколько объектов в пространство имен 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 и начал использовать это.