访问对象定义中的对象属性

时间:2009-09-08 15:58:46

标签: javascript json

所以我有一个如下所示的对象定义:

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()的形式访问它。

有人可以帮我解决这个问题吗?

2 个答案:

答案 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_ROWSparams目前还不可用......

除此之外,你可能想宣布一个吸气剂......


编辑那么,在这种情况下,一个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
}

是的,它并不像你试图使用的那样时髦,但它只是有效...而且它至少可以为你节省一次电话......