所以我有一个如下所示的对象定义:
var Foo = window.Foo = {
MIN_ROWS : 10,
MIN_COLS : 10,
NUM_ROWS : (function(){ return Math.max( parseInt(this.params.rows) || 0, this.MIN_ROWS); })(),
// etc...
params: (function(){ /* ... */ })() // parses the GET querystring parameters from the URL and returns as a JSON object
}
对于NUM_ROWS
属性,我想将其设置为Foo.params.rows
(如果它存在且大于MIN_ROWS
,否则将其设置为MIN_ROWS
。
我已经找到了这个逻辑,唯一给我带来麻烦的是当我自动调用上面的函数时,this
变量引用window
并且不要像我期望的那样Foo
。 (这是我在控制台中收到的错误消息:"TypeError: Result of expression 'this.params' [undefined] is not an object."
)
如果我不自行调用该功能,它可以完美地工作。但是,我希望NUM_ROWS
是一个整数,而不是一个函数,因此我可以在代码的其他部分以Foo.NUM_ROWS
而不是Foo.NUM_ROWS()
的形式访问它。
有人可以帮我解决这个问题吗?
答案 0 :(得分:1)
以下是我修复它的方法,我稍微简化了代码,但是你应该明白这个想法,如果你还没有,希望它有所帮助。如果您正在使用javascript钉,那么下面的链接绝对值得关注。
var FooFactory = function(){
this.MIN_ROWS = 10;
this.MIN_COLS = 10;
this.params = { rows : 12};
this.NUM_ROWS = Math.max( parseInt(this.params.rows) || 0, this.MIN_ROWS);
// etc...
};
var Foo = window.Foo = new FooFactory();
document.write(Foo.NUM_ROWS);
这在JavaScript中是调用的对象,而不是被调用的对象,你需要查看Doug Crockford的网站,以获得一些关于这意味着什么的好文章,以及它在这种情况下如何影响你的使用。
This article特别向您展示了这一切
答案 1 :(得分:0)
为什么不在params
之前初始化NUM_ROWS
? params
目前还不可用......
编辑那么,在这种情况下,一个getter确实是一个不错的选择...虽然在IE中不会很好用... 除此之外,你总是可以一步一步地构建对象......
var Foo = window.Foo = {
MIN_ROWS : 10,
MIN_COLS : 10
}
Foo.params = //parse input
Foo.NUM_ROWS = Math.max( parseInt(Foo.params.rows) || 0, Foo.MIN_ROWS));
或者也许这样:
var params = //parse input
var NUM_ROWS = Math.max( parseInt(params.rows) || 0, this.MIN_ROWS));
var Foo = window.Foo = {
MIN_ROWS : 10,
MIN_COLS : 10
params: params,
NUM_ROWS: NUM_ROWS
}
是的,它并不像你试图使用的那样时髦,但它只是有效...而且它至少可以为你节省一次电话......