Пространство имен Javascript — несколько уровней

#javascript #javascript-namespaces

#javascript #javascript-пространства имен

Вопрос:

В настоящее время я делаю следующее, чтобы предоставить моему коду javascript пространство имен:

 (function(foo, $, undefined) {
    // function: showNoteDialog
    foo.showNoteDialog = function() {
       // ...
    }
}(window.foo = window.foo || {}, jQuery));
  

Я бы предпочел вместо:

 foo.showNoteDialog()
  

Должно иметь многоуровневое пространство имен:

 foo.notes.showDialog()
foo.other.showDialog()
  

Возможно ли это? Как бы я это сделал?

Ответ №1:

Вот как я обычно это делаю:

 var TopLevel = TopLevel || {}; //Exentd or Create top level namespace
TopLevel.FirstChild = TopLevel.FirstChild || {}; //Extend or Create a nested name inside TopLevel
  

Использование этого метода обеспечивает безопасность между файлами. Если TopLevel уже существует, вы присвоите его переменной TopLevel, если этого не произойдет, вы создадите пустой объект, который можно расширить.

Итак, предполагая, что вы хотите создать приложение, которое существует в пространстве имен приложений и расширяется в нескольких файлах, вам понадобятся файлы, которые выглядят так:

Файл 1 (библиотека):

 var Application = Application || {};

Application.CoreFunctionality = Application.CoreFunctionality || {};
Application.CoreFunctionality.Function1 = function(){
  //this is a function
}//Function1
  

Файл 2 (библиотека):

 var Application = Application || {};

Application.OtherFunctionality = Application.OtherFunctionality || {};
Application.OtherFunctionality.Function1 = function(){
  //this is a function that will not conflict with the first
}
  

Файл 3 (рабочий):

 //call the functions (note you could also check for their existence first here)
Application.CoreFunctionality.Function1();
Application.OtherFunctionality.Function1();
  

Ответ №2:

Взгляните на namespace.js . Это позволяет вам объявлять вложенные пространства имен с помощью общедоступных и частных методов. Это приятно, потому что позволяет вызывать любой метод внутри блока пространства имен без префикса — независимо от области видимости.

 (function() {
  namespace("example.foo", bar);

  function foobar() { return "foobar"; };
  function bar() { return foobar(); };
}());

example.foo.bar(); // -> "foobar"
  

Ответ №3:

В JS нет пространств имен, но вы можете назначать объекты другим объектам, таким как

 x = {};
x.y = {};
x.y.z = function() {};
  

Комментарии:

1. Честно говоря, в сообществе JS их обычно называют «пространствами имен», когда они используются для организации кода.

2. Конечно. Я просто указываю, что это не настоящие пространства имен, они просто похожи на них.

Ответ №4:

Я делаю это с помощью bob.js рамки:

 bob.ns.setNs('myApp.myMethods', {
    method1: function() {
        console.log('This is method 1');
    },

    method2: function() {
        console.log('This is method 2');
    }
});
//call method1.
myApp.myMethods.method1();
//call method2.
myApp.myMethods.method2();
  

Ответ №5:

Как вы можете видеть, автоматизировать объявление многоуровневых пространств имен в javascript очень просто:

 var namespace = function(str, root) {
    var chunks = str.split('.');
    if(!root)
        root = window;
    var current = root;
    for(var i = 0; i < chunks.length; i  ) {
        if (!current.hasOwnProperty(chunks[i]))
            current[chunks[i]] = {};
        current = current[chunks[i]];
    }
    return current;
};

// ----- USAGE ------

namespace('ivar.util.array');

ivar.util.array.foo = 'bar';
alert(ivar.util.array.foo);

namespace('string', ivar.util);

ivar.util.string.foo = 'baz';
alert(ivar.util.string.foo); 
  

Попробуйте: http://jsfiddle.net/stamat/Kb5xY/ Сообщение в блоге: http://stamat.wordpress.com/2013/04/12/javascript-elegant-namespace-declaration/