2009-09-08 54 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