返回JavaScript中的引用

返回JavaScript中的引用,javascript,Javascript,代码如下: 我正在尝试获取collection.prototype.add以返回一个引用,这样最终警报将显示testing,testing,123,testing。有没有办法完成我在这里要做的事情 HTML: 在JavaScript中,创建所需的引用是不可能的。您可以得到的最接近的对象是嵌套对象或闭合对象,或者只是将其复制过来,如下所示: var collection = function() { this.items = {}; }; collection.prototype.ad

代码如下:

我正在尝试获取
collection.prototype.add
以返回一个引用,这样最终警报将显示
testing,testing,123,testing
。有没有办法完成我在这里要做的事情

HTML:


在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);
但这并不是真正的“约束”。如果需要这种功能,就必须使用嵌套对象,这很可能会破坏语法的甜点


在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);
但这并不是真正的“约束”。如果需要这种功能,就必须使用嵌套对象,这很可能会破坏语法的甜点


您的问题在于这一行:

this.items[sElmtId] = document.getElementById(sElmtId);
这将用DOM节点覆盖当前分配给
This.items[sElmtId]
的对象。相反,应将节点指定给该对象的属性:

this.items[sElmtId].node = document.getElementById(sElmtId);
这样,
obj.node
将始终引用当前节点:

alert(obj.node.innerHTML);



旁注:fiddle的问题还在于,您在DOM尚未构建时执行代码(
没有包装(head)
),因此它无法找到
#spantest
。DOM准备好后,您必须运行代码,
no wrap(body)
onDomRead
onLoad
,您的问题是这一行:

this.items[sElmtId] = document.getElementById(sElmtId);
这将用DOM节点覆盖当前分配给
This.items[sElmtId]
的对象。相反,应将节点指定给该对象的属性:

this.items[sElmtId].node = document.getElementById(sElmtId);
这样,
obj.node
将始终引用当前节点:

alert(obj.node.innerHTML);



旁注:fiddle的问题还在于,您在DOM尚未构建时执行代码(
没有包装(head)
),因此它无法找到
#spantest
。DOM准备好后,您必须运行代码,
no wrap(body)
onDomRead
onLoad
,我希望obj作为对该.items[sElmtId]的引用,因此当稍后使用.bind()更新该.items[sElmtId]时,obj将指向与该.items[sElmtId]相同的DOM元素需要。需要这个代码的原因有点复杂。在更大版本的代码中,我有实例化DOM元素的对象。我希望这些对象具有一个属性(例如,this.dom_elmt),该属性指向它们负责渲染的dom元素。我之所以在事后尝试创建DOM引用,是因为我是为IE6兼容性而写的。在内存中构造DOM片段对于IE6中的大页面来说太慢了。我必须通过字符串创建HTML,在函数退出后插入DOM,然后创建指向DOM元素的链接。我希望obj是对该.items[sElmtId]的引用,因此当稍后使用.bind()更新该.items[sElmtId]时,obj将指向与该.items[sElmtId]相同的DOM元素需要。需要这个代码的原因有点复杂。在更大版本的代码中,我有实例化DOM元素的对象。我希望这些对象具有一个属性(例如,this.dom_elmt),该属性指向它们负责渲染的dom元素。我之所以在事后尝试创建DOM引用,是因为我是为IE6兼容性而写的。在内存中构造DOM片段对于IE6中的大页面来说太慢了。我必须通过字符串创建HTML,在函数退出后插入DOM,然后创建指向DOM元素的链接。