在JavaScript中返回引用

时间:2012-03-01 23:26:30

标签: javascript

以下是代码:

http://jsfiddle.net/GKBfL/

我正在尝试让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);​

2 个答案:

答案 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);

DEMO


旁注:你的小提琴的问题还在于你还没有构建DOM(no wrap (head))时执行代码,因此无法找到#spantest。您必须在DOM准备就绪后运行代码,no wrap (body)onDomReadonLoad

答案 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);

但它不会真正“束缚”。如果你需要那种功能,你将不得不使用嵌套对象,它可能会破坏你的语法糖点。

http://jsfiddle.net/GKBfL/7/