2011-10-10 111 views
1

我想要一個對象數組來監視(加載)每個span元素(使用XMLHTTPRequest來檢索另一個頁面上的URL並放入相關的跨度 - 我沒有在下面包含這個功能,因爲我只對對象數組感興趣)。Javascript:使用對象而不是數組通過id檢索對象

我喜歡以下(Doug Crockford?) snippet的想法,但我不能得到它的工作。我得到:

URLLoad.LoadingTxt000003.SetLoadTimeout is not a function

任何想法?

這裏是我的代碼:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 

<html> 
<head> 

<script language="javascript" type="text/javascript"> 

function URLLoad(id) { 
    alert(id); 

    return URLLoad[id] = { 
     Tagid:id, 
     LoadTimeout:0 
    } 
} 

URLLoad.prototype.SetLoadTimeout = function(lt) { 
    this.LoadTimeout = lt; 
} 

URLLoad("LoadingTxt000003"); 
URLLoad("LoadingTxt000005"); 

alert(URLLoad.LoadingTxt000003.DelayTimeout + URLLoad.LoadingTxt000005.DelayTimeout); 

URLLoad['LoadingTxt000003'].SetLoadTimeout(20); //doesn't work 
URLLoad.LoadingTxt000003.SetLoadTimeout(20); //doesn't work 

</script> 

</head> 

<body> 

    <span id="LoadingTxt000003">...</span> 
    <span id="LoadingTxt000005">...</span> 

</body> 
</html> 

回答

1

爲了有原型繼承工作,你需要做兩兩件事:創建對象時,爲了有正確的原型this

  1. 使用new運算符。

    new URLLoad(...) 
    
  2. 返回從構造函數的值。您正在返回的值沒有正確的原型,但無論如何都有優先權。

    function URLLoad(){ 
        this.tagId = ...; 
        this.timeOut = ...; 
    } 
    

當然你現在可能抱怨我沒有做的cacheing。那麼,我認爲最好是將結構從緩存中分離出來。

var cache = {}; 
function urlLoad(key){ 
    if(!cache[key]){ cache[key] = new URLLoad(key); } 
    return cache[key]; 
} 

如果你想避免那些暴露cacheURLLoad全局,我們可以讓他們私下跟模塊模式:

var urlLoad = (function(){ 

    function URLLoad(){...}; 
    URLLoad.prototype = {...}; 

    var cache = {}; 
    function urlLoad(){...}; 

    return urlLoad; 
}()); 
0

URLLoad是一個構造函數。嘗試使用新運營商的前綴:

new URLLoad("LoadingTxt000003"); 
+0

URLLoad( 「LoadingTxt000003」);當我彈出警報時會運行構造函數。 –

+1

構造函數是正常的函數,但'new'運算符將'this'變量綁定到新的上下文中。應始終使用'new'運算符調用構造函數。 – Marcelo

+0

我用新的前綴URLLoad(「LoadingTxt000003」)和URLLoad(「LoadingTxt000005」),仍然會得到相同的錯誤。 –

0

我認爲您的解決方案過於複雜。如果你希望緩存你的看法的信息,只是使用對象文本,並做

var viewCache = {}; 

然後補充意見,只是做

viewCache['LoadingTxt000003'] = 20; 

注意,這裏使用的視圖元素的ID密鑰和超時值作爲val,在緩存中。還要注意,儘管[id]看起來像一個數組索引,但在對象文字上使用時,它只是設置鍵/值對的一種方法。

你可以做這樣的事情

viewCache['LoadingTxt000003'] = {'timeout': 20}; 

展開它現在您的高速緩存對象文本,而且它的值對象的文字,以及,如果你要存儲超過一塊的,這是有用您的緩存中的信息。

+0

我不想緩存視圖信息 - 我編輯了我的問題,希望能夠澄清。 –

相關問題