2009-09-08 115 views
1

所以我有一个对象的定义,看起来像这样:访问对象的对象定义中的属性

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

对于那些谁劝定义'PARAMS 'NUM_ROWS'之前:我认为它不重要。 我试着在NUM_ROWS上面移动'params',我仍然得到相同的错误信息。 这个错误是说''this.params'[undefined]不是一个对象',但在这个上下文中,'this'指的是全局'window'对象,而不是'Foo'对象,正如我在'NUM_ROWS'函数开头插入'console.log(this)'所发现的那样。 – gabriel 2009-09-08 16:41:12

+0

答案更新...实际上,这是合乎逻辑的,因为它总是在函数中被称为函数,而不是被称为方法... – back2dos 2009-09-08 17:05:31

+0

@gabriel,我快速浏览了这个,并且改变了我的文章,你可能得到这个排序。自从我在不使用框架的情况下查看js,这已经有一段时间了,所以你可以比我的例子更好,但是我希望它解决了你使用this关键字时遇到的问题。 – 2009-09-09 09:15:02

回答

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是调用该对象,而不是被调用,你需要看一下道格·克罗克福德的网站获得什么,这意味着一些好文章,以及它如何影响在此您的使用对象案件。

特别This article显示了这是怎么一回事

0

你为什么不初始化paramsNUM_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 
} 

是的,它不是那么时髦,你想干什么用的,但它只是作品...加上它可以节省您的至少一个电话...


+0

感谢您的回应,但不幸的是,这似乎并没有解决任何问题。请看我上面的评论。 – gabriel 2009-09-08 16:48:58