我是一个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而且有点混乱。
你说什么?这种方法有什么陷阱?是否有其他方法被认为更标准?
答案 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() {
}
};
})();