Пространство имен Javascript - несколько уровней - PullRequest
7 голосов
/ 19 октября 2011

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

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

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

foo.showNoteDialog()

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

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

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

Ответы [ 5 ]

8 голосов
/ 19 октября 2011

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

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();
4 голосов
/ 19 октября 2011

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

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

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

example.foo.bar(); // -> "foobar"
2 голосов
/ 19 октября 2011

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

x = {};
x.y = {};
x.y.z = function() {};
1 голос
/ 01 ноября 2012

Я делаю это, используя bob.js framework :

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();
0 голосов
/ 12 апреля 2013

Автоматизация объявления многоуровневых пространств имен в 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/

...