[英]Javascript: retrieve objects by id, using an object, not an array
我想要一个对象数组来监视(跨接)每个span元素 (使用XMLHTTPRequest来检索另一个页面上的URL并将其放入相关的span中-我下面没有包含此功能,因为我只对object数组感兴趣)。
我喜欢以下代码片段(Doug Crockford?)的想法,但我无法使其正常工作。 我得到:
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>
为了进行原型继承工作,您需要做两件事:
创建对象时使用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
全局变量,我们可以使用模块模式将它们URLLoad
私有:
var urlLoad = (function(){
function URLLoad(){...};
URLLoad.prototype = {...};
var cache = {};
function urlLoad(){...};
return urlLoad;
}());
URLLoad
是一个构造函数。 尝试使用new运算符添加前缀:
new URLLoad("LoadingTxt000003");
我认为您的解决方案过于复杂。 如果要缓存有关视图的信息,只需使用对象文字并执行
var viewCache = {};
然后在其中添加视图
viewCache['LoadingTxt000003'] = 20;
请注意,这在缓存中使用view元素的id作为键,将超时用作val。 还要注意,即使[id]
看起来像数组索引,当在对象文字上使用它时,它只是设置键/值对的一种方法。
您可以通过执行以下操作来扩展它
viewCache['LoadingTxt000003'] = {'timeout': 20};
现在,您的缓存是一个对象文字,它的值也就是对象文字,如果您要在缓存中存储多个信息,这很有用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.