我想要一个对象数组来监视(加载)每个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>
答案 0 :(得分:1)
为了进行原型继承工作,您需要做两件事:
创建对象时使用new运算符,以使this
具有正确的原型。
new URLLoad(...)
不从构造函数返回一个值。您返回的值没有正确的原型,但无论如何都具有优先权。
function URLLoad(){
this.tagId = ...;
this.timeOut = ...;
}
当然,您现在可能会抱怨我没有进行缓存。好吧,我认为最好将结构与缓存区分开来。
var cache = {};
function urlLoad(key){
if(!cache[key]){ cache[key] = new URLLoad(key); }
return cache[key];
}
如果您想避免使用那些公开的cache
和URLLoad
全局变量,我们可以使用模块模式将它们设为私有:
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};
现在你的缓存是一个对象文字,它的值也是对象文字,如果要在缓存中存储多条信息,这很有用。