2011-10-10 109 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

我不想缓存视图信息 - 我编辑了我的问题,希望能够澄清。 –

相关问题