Добавить несколько объектов в пространство имен JavaScript из разных файлов - PullRequest
11 голосов
/ 02 июня 2010

С учетом пространств имен 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

Ответы [ 2 ]

8 голосов
/ 02 июня 2010

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

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

Это может помочь вам отделить ваши модули от чего-то вроде этого:

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

and 

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

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

2 голосов
/ 18 августа 2012

Интересно, я обнаружил AMD и RequireJS и начал использовать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...