Объявление пространства имен Javascript - PullRequest
3 голосов
/ 23 сентября 2010

Как правильно объявить пространство имен?Я только что прочитал «Разработка больших веб-приложений», и автор предлагает использовать:

if (!window.YourNamespace) {
  YourNamespace = {};
}

кажется достаточно простым ... но я вижу все библиотеки javascript для объявления пространств имен и альтернативных методов.Нет ли стандартного способа сделать это?Какие-либо проблемы с вышеуказанным?

Ответы [ 7 ]

2 голосов
/ 23 сентября 2010

Упомянутый путь объявления пространства имен автором книги действительно довольно хорош.Но когда вам нужно повторить это в нескольких файлах, а пространство имен имеет несколько подпространств имен, это может стать довольно утомительным:

if (!window.Foo) {
  Foo = {};
}
if (!window.Foo.Bar) {
  Foo.Bar = {};
}
if (!window.Foo.Bar.Baz) {
  Foo.Bar.Baz = {};
}
etc...

Вместо этого вы должны написать простую функцию, которая позаботится об объявлении пространств имен для вас:1004 *

function namespace(ns) {
  var parts = ns.split(/\./);
  var obj = window;
  for (var i=0; i<parts.length; i++) {
    var p = parts[i];
    if (!obj[p]) {
      obj[p] = {};
    }
    obj = obj[p];
  }
}

Теперь вы можете объявить все вложенное пространство имен одной строкой:

namespace("Foo.Bar.Baz");

В среде ExtJS это в основном то, что делает функция Ext.ns ().Я действительно не знаю о других библиотеках.

2 голосов
/ 23 сентября 2010

Я видел, что это соглашение использовало несколько мест.

window.YourNamespace = window.YourNamespace || {};
0 голосов
/ 13 мая 2014

Некоторые примеры функций пространства имен:

namespace = function(ns){
    arr = ns.split(".")
    parent = window

    var temp

    while( ( temp = arr.shift()) !== undefined){
        parent[temp] = parent[temp] || {}
        parent = parent[temp]
    }
}

Затем вы можете использовать его как:

namespace("your.own.namespace")

your.own.namespace.Car= function () {

    this.speed = 30; 

}
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/

0 голосов
/ 02 апреля 2013

bob.js обрабатывает пространства имен следующим образом:

bob.ns.setNs('YourNamespace', {

    /*define your members here. e.g.:*/
    method1: function () { /*...*/ }
});


// now, merge another, sub-namespace.
bob.ns.setNs('YourNamespace.YourSubNamespace', {

    method2 function () { /*...*/ }
});

//call methods:
YourNamespace.method1();
YourNamespace.YourSubNamespace.method2();
0 голосов
/ 23 сентября 2010
  var Utils = {
        namespace : function(name) {
                return window[name] = window[name] || {};
        }
  };

или, если вы предпочитаете использовать способ:

if (typeof window.YourNamespace === 'undefined') {
    YourNamespace = {};
}
0 голосов
/ 23 сентября 2010

Как вы увидите, между средами нет стандартного пути, но они выходят за рамки базовых, так что, например, X.Y.Z создаст все объекты в этой цепочке, если они еще не существуют.

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