Javascript命名空间声明

时间:2010-09-23 11:14:47

标签: javascript namespaces cross-browser

声明命名空间的正确方法是什么?我刚读过“开发大型Web应用程序”,作者建议使用:

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

似乎很容易..但我看到所有的javascript库用于声明命名空间和替代方法。有没有标准的方法来做到这一点?上述任何问题?

7 个答案:

答案 0 :(得分:2)

我见过这个惯例使用了几个地方。

window.YourNamespace = window.YourNamespace || {};

答案 1 :(得分:2)

书籍作者提到的名称空间声明方式确实非常好。但是当你需要在几个文件中重复它并且命名空间有几个子命名空间时,它会变得相当繁琐:

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

相反,您应该编写一个简单的函数来处理为您声明命名空间:

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 :(得分:0)

在框架之间没有标准的方法,但是它们确实超出了基础,所以例如X.Y.Z,如果它们不存在,它将创建该链中的所有对象。

答案 3 :(得分:0)

  var Utils = {
        namespace : function(name) {
                return window[name] = window[name] || {};
        }
  };

或者如果您更喜欢使用方式:

if (typeof window.YourNamespace === 'undefined') {
    YourNamespace = {};
}

答案 4 :(得分:0)

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();

答案 5 :(得分:0)

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

答案 6 :(得分:-1)

命名空间函数的一些示例:

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; 

}