以下是代码:
我正在尝试让collection.prototype.add
返回引用,以便最终警报显示testing, testing, 123, testing
。有没有办法完成我在这里要做的事情?
HTML:
<span id="spantest">testing, testing, 123, testing</span>
JavaScript的:
var collection = function () {
this.items = {};
}
collection.prototype.add = function(sElmtId) {
this.items[sElmtId] = {};
return this.items[sElmtId];
}
collection.prototype.bind = function() {
for (var sElmtId in this.items) {
this.items[sElmtId] = document.getElementById(sElmtId);
}
}
var col = new collection();
var obj = {};
obj = col.add('spantest');
col.bind();
alert(obj.innerHTML);
答案 0 :(得分:2)
你问题就在这一行:
this.items[sElmtId] = document.getElementById(sElmtId);
这将使用DOM节点覆盖当前分配给this.items[sElmtId]
的对象。相反,您应该将节点分配给该对象的属性:
this.items[sElmtId].node = document.getElementById(sElmtId);
这样,obj.node
将始终引用当前节点:
alert(obj.node.innerHTML);
旁注:你的小提琴的问题还在于你还没有构建DOM(no wrap (head)
)时执行代码,因此无法找到#spantest
。您必须在DOM准备就绪后运行代码,no wrap (body)
,onDomRead
或onLoad
。
答案 1 :(得分:1)
在JavaScript中无法创建您需要的引用。你可以得到的最接近的东西是嵌套或封闭的对象,或者只是复制它,如下所示:
var collection = function() {
this.items = {};
};
collection.prototype.add = function(sElmtId) {
return this.items[sElmtId] = {};
};
collection.prototype.bind = function() {
for(var sElmtId in this.items) {
var element = document.getElementById(sElmtId);
for(var x in element) {
this.items[sElmtId][x] = element[x];
}
}
};
var col = new collection();
var obj = {};
obj = col.add('spantest');
col.bind();
alert(obj.innerHTML);
但它不会真正“束缚”。如果你需要那种功能,你将不得不使用嵌套对象,它可能会破坏你的语法糖点。