JavaScript命名空间声明

我创建了一个JavaScript类,如下所示:

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

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

MyClass.MyPublic("hello");

上面的代码正在工作,但我的问题是,如果我想为该类引入名称空间。

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

Namespace.MyClass.MyPublic("Hello World");

如果我添加Namespace.MyClass,它会抛出错误“语法错误”。 我确实尝试添加“window.Namespace = {}”,它也不起作用。

谢谢.. :)


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

var Namespace = {};
Namespace.MyClass = (function () {
  // ...
}());

更灵活但更复杂的方法:

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 || {}));

如上构建Namespace.MyClass ,但不依赖于已经存在的Namespace 。 如果它不存在,它会声明并创建它。 这也可以让你在不同的文件中并行加载多个Namespace成员,加载顺序无关紧要。

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


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

将它放在任何你想命名空间的函数之上:

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

MyNamespace.UI.Controls.MyClass = function(){};
MyNamespace.UI.Controls.MyClass.prototype.someFunction = function(){};

这种方法实际上是独立的,可以很容易地适用于您的应用程序。 只需找到你的应用程序的基本命名空间并替换“YAHOO”,你就会得到类似MyOrg.namespace的东西。 这种方法的好处在于,您可以在任何深度声明名称空间,而无需在两者之间创建对象数组,如“UI”或“Controls”


一个简洁的方式来做你所要求的就是创建“命名空间”作为一个像这样的对象文字:

var Namespace = {
    MyClass : (function() {
        ... rest of your module
    })();
};

如果您想在其他文件的名称空间中附加其他详细信息,这可能会导致冲突,但您可以通过始终创建名称空间,然后明确设置成员来解决该问题。

链接地址: http://www.djcxy.com/p/17063.html

上一篇: JavaScript Namespace Declaration

下一篇: Does this way of defining JS objects have any purpose?