Javascript:使用对象而不是数组通过id检索对象

时间:2011-10-10 14:10:40

标签: javascript oop object

我想要一个对象数组来监视(加载)每个span元素(使用XMLHTTPRequest检索另一个页面上的URL并放入相关的span - 我没有在下面包含此功能因为我只对对象数组感兴趣。

我喜欢以下(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>

3 个答案:

答案 0 :(得分:1)

为了进行原型继承工作,您需要做两件事:

  1. 创建对象时使用new运算符,以使this具有正确的原型。

    new URLLoad(...)
    
  2. 从构造函数返回一个值。您返回的值没有正确的原型,但无论如何都具有优先权。

    function URLLoad(){
        this.tagId = ...;
        this.timeOut = ...;
    }
    
  3. 当然,您现在可能会抱怨我没有进行缓存。好吧,我认为最好将结构与缓存区分开来。

    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;
    }()); 
    

答案 1 :(得分:0)

URLLoad是一个构造函数。尝试使用new运算符为它添加前缀:

new URLLoad("LoadingTxt000003");

答案 2 :(得分:0)

我认为您的解决方案过于复杂。如果要缓存有关视图的信息,只需使用对象文字并执行

var viewCache = {};

然后添加视图,只需执行

viewCache['LoadingTxt000003'] = 20;

请注意,它在缓存中使用视图元素的id作为键,并将超时作为val。另请注意,即使[id]看起来像数组索引,但在对象文字上使用时,它只是一种设置键/值对的方法。

您可以通过执行类似

的操作来扩展它
viewCache['LoadingTxt000003'] = {'timeout': 20};

现在你的缓存是一个对象文字,它的值也是对象文字,如果要在缓存中存储多条信息,这很有用。