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

Я ценил бы мысли и вход о том, как лучше всего пойти об этом виде 'включения'.

Спасибо за чтение.

Brian

11
задан sg7 17 March 2018 в 18:51
поделиться

1 ответ

Это определенно сработает. Однако имейте в виду, что этот исходный порядок повлияет на вашу реализацию: если def.js когда-либо окажется включенным до abc.js, ваше определение foo и ns.abc никогда не будет выполнено.

Взгляните на старую функцию пространства имен YUI для примера : они проверяют либо использование существующего объекта, либо инициализацию нового объекта, вероятно, по указанной выше причине.

Это может очень помочь вам разделить ваши модули примерно так:

ns = ns || {};
ns.abc = function(){ ... }();

and 

ns = ns || {};
ns.def = function() ... }();

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

8
ответ дан 3 December 2019 в 10:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: