3

我是一个 javascript 新手,我想出了以下命名空间方案:

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

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

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

})();

Company.namespace 是一个由脚本注册的函数,它简单地创建直到模块的对象链。

外部,在非全局范围内:

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

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

你说什么?这种方法有什么陷阱?还有其他一些被认为更标准的方法吗?

4

2 回答 2

1

你的方法对我来说很好。

但是,您也可以通过从自动执行函数返回“类”来稍微不同地做到这一点:

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

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

于 2012-07-04T08:31:13.380 回答
1

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

MyApp.MyClass = function() {
};

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

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

但是,如果您需要范围全局变量,那么您可以这样做

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

   MyApp.MyClass = function() {
   };
   MyApp.MyClass.prototype = function() {
       foo: function() {
       }
   };
})();
于 2012-07-10T14:52:06.580 回答