编写javascript对象的最简洁格式是什么?
目前我用以下格式写我的
if (Namespace1 == null) var Namespace1 = {};
if (Namespace1.NameSpace2 == null) Namespace1.NameSpace2 = {};
Namespace1.NameSpace2.Class1 = function(param1,param2){
// define private instance variables and their getters and setters
var privateParam = param1;
this.getPrivateParam = function() {return privateParam;}
this.publicParam1 = param2;
}
Namespace1.Namespace2.Class1.prototype = {
publicParam1:null,
publicFunction1:function() {/* Function body*/}
}
这种格式现在运行良好,因为YUI文档软件能够解析它,评论和回馈良好的文档。但它没有提供的是在命名空间中声明静态全局方法的简洁方法。我也想知道是否有更简洁的方法来声明私有变量。
我的问题是,是否有人使用更清晰的方式定义javascript对象,如果是这样,为什么你的方法更好?
谢谢!
答案 0 :(得分:5)
首先,如果您不知道是否定义了Namespace1
,请使用typeof this.Namespace1 !== "undefined"
,因为访问Namespace1会在未定义时抛出错误。此外,未定义的属性为undefined
,而不是null
(尽管undefined == null
)。如果实际上某些内容 null ,您的检查将失败。如果您不想使用typeof
检查属性是否未定义,请使用myObject.property === undefined
。
此外,您的第二个示例语法无效。以下是我认为你想做的事情:
Namespace1.Namespace2.Class1.prototype = {
publicParam1 : null,
publicFunction1 : function () {/* Function body*/}
};
答案 1 :(得分:5)
模块模式可以帮到你:
var Namespace1 = Namespace1 || {};
Namespace1.Namespace2 = Namespace1.Namespace2 || {};
Namespace1.Namespace2.Class1 = function(param1, param2) {
// define private instance variables and their getters and setters
var privateParam = param1;
this.getPrivateParam = function() { return privateParam; }
this.publicParam1 = param2;
return {
init: function() {
alert('hi from Class1');
}
}
} ();
您可以在此处详细了解:http://yuiblog.com/blog/2007/06/12/module-pattern/
Namespace1.Namespace2.Class1.init();
答案 2 :(得分:1)
当然要重写前两行:
var Namespace1 = Namespace1 || {};
Namespace1.Namespace2 = Namespace1.Namespace2 || {};
剩下的看起来还可以。私有变量几乎就是每个人都这样做的。正如您所做的那样,静态方法应该分配给prototype
。
请注意重新定义对象的整个原型,因为它会阻止您使用基于prototype
的继承的常见模式。例如:
// You inherit like this...
Sub.prototype = new Super();
obj = new Sub();
// Then you overwrite Sub.prototype when you do this:
Sub.prototype = {foo:1, bar:2}
// Instead, you should assign properties to the prototype individually:
Sub.prototype.foo = 1;
Sub.prototype.bar = 2;
答案 3 :(得分:1)
我使用以下功能:
jQuery.namespace = function() {
var a = arguments, o = null, i, j, d;
for (i=0; i<a.length; i=i+1) {
d = a[i].split(".");
o = window;
for (j=0; j<d.length; j=j+1) {
o[d[j]] = o[d[j]] || {};
o = o[d[j]];
}
}
return o;
}
然后我可以使用此函数创建一个名称空间,如下所示:
$.namespace("jQuery.namespace1");
一旦我创建了命名空间,我就可以在其中声明函数或任何你想要的东西:
一个功能:
$.namespace1.asyncRequest = function() {
[function body]
};
常数:
$.namespace1.OFFSET = 10;
一个对象:
$.namespace1.request = { requestId: 5, protocol: 'JSON' };
我认为它简单而优雅: - )
再见 亚历