Javascript命名空间 - 这种特殊方法是一种很好的做法吗?

时间:2012-07-04 08:04:54

标签: javascript namespaces

我是一个javascript新手,我为namespacing提出了以下方案:

(function() {
    var ns = Company.namespace("Company.Site.Module");

    ns.MyClass = function() { .... };

    ns.MyClass.prototype.coolFunction = function() { ... };

})();

Company.namespace是一个由脚本注册的函数,它只创建直到Module的对象链。

外部,在非全球范围内:

var my = new Company.Site.Module.MyClass();

我特别询问通过立即执行的包装匿名函数将变量ns隐藏在全局范围内的方法。我可以在任何地方写Company.Site.Module,但与将ns存储在局部变量中相比,它不是DRY而且有点混乱。

你说什么?这种方法有什么陷阱?是否有其他方法被认为更标准?

2 个答案:

答案 0 :(得分:1)

你的方法对我来说很好。

但是,您也可以通过从自执行函数返回“类”来略微区别:

Company.Site.Module.MyClass = (function() {
    var MyClass = function() { ... };
    MyClass.prototype.foo = function() { ... };
    return MyClass;
})();

这至少删除了所有ns.前缀。命名空间函数仍可用于创建对象,但在自执行函数之外。

答案 1 :(得分:1)

您不需要像这样对类进行范围调整,只有在类外部有全局变量时才需要它。我用这种方法......

MyApp.MyClass = function() {
};

MyApp.MyClass.prototype = {
   foo: function() {
   }
};

另请注意,我使用对象文字来表示更清晰的原型声明

但是,如果您需要对全局变量进行范围调整,则可以执行

(function() {
   var scopedGlobalVariable = "some value";

   MyApp.MyClass = function() {
   };
   MyApp.MyClass.prototype = function() {
       foo: function() {
       }
   };
})();