JavaScript命名空间声明

hei*_*don 30 javascript

我创建了一个javascript类如下:

var MyClass = (function() {
   function myprivate(param) {
      console.log(param);
   }

   return {
      MyPublic : function(param) {
         myprivate(param);
      }
   };
})();

MyClass.MyPublic("hello");
Run Code Online (Sandbox Code Playgroud)

上面的代码是有效的,但我的问题是,如果我想将命名空间引入该类.

基本上我希望能够像这样调用类:

Namespace.MyClass.MyPublic("Hello World");
Run Code Online (Sandbox Code Playgroud)

如果我添加了Namespace.MyClass,它将抛出错误"语法错误".我确实尝试添加"window.Namespace = {}",但它也不起作用.

谢谢.. :)

bch*_*rry 45

通常我建议这样做(假设Namespace没有在其他地方定义):

var Namespace = {};
Namespace.MyClass = (function () {
  // ...
}());
Run Code Online (Sandbox Code Playgroud)

一种更灵活但更复杂的方法:

var Namespace = (function (Namespace) {
   Namespace.MyClass = function() {

       var privateMember = "private";
       function myPrivateMethod(param) {
         alert(param || privateMember);
       };

       MyClass.MyPublicMember = "public";
       MyClass.MyPublicMethod = function (param) {
          myPrivateMethod(param);
       };
   }
   return Namespace
}(Namespace || {}));
Run Code Online (Sandbox Code Playgroud)

这构建Namespace.MyClass如上,但不依赖于Namespace已存在的.如果它尚不存在,它将声明并创建它.这也允许您Namespace在不同的文件中并行加载多个成员,加载顺序无关紧要.

更多信息:http://www.adequatelygood.com/2010/3/JavaScript-Module-Pattern-In-Depth


phi*_*bin 8

YUI有一个很好的方法来声明命名空间

if (!YAHOO) {
        var YAHOO = {};
}

YAHOO.namespace = function () {
    var a = arguments,
        o = null,
        i, j, d;
    for (i = 0; i < a.length; i = i + 1) {
        d = ("" + a[i]).split(".");
        o = YAHOO;
        for (j = (d[0] == "YAHOO") ? 1 : 0; j < d.length; j = j + 1) {
            o[d[j]] = o[d[j]] || {};
            o = o[d[j]];
        }
    }
    return o;
}
Run Code Online (Sandbox Code Playgroud)

将它放在任何你想要命名空间的函数上面,如下所示:

YAHOO.namespace("MyNamespace.UI.Controls")

MyNamespace.UI.Controls.MyClass = function(){};
MyNamespace.UI.Controls.MyClass.prototype.someFunction = function(){};
Run Code Online (Sandbox Code Playgroud)

这种方法实际上是独立的,可以很容易地适应您的应用程序.只需找到并用你的应用程序的基本命名空间替换"YAHOO",你就会得到像MyOrg.namespace这样的东西.这个方法的好处是你可以在任何深度声明命名空间而不必在其间创建对象数组,比如"UI"或"控件"