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