Javascript:数组作为对象属性(& ZeroClipboard)

时间:2012-04-09 02:26:07

标签: javascript arrays object properties

好吧,我一开始就承认我在这里有点过头了。

我有一些代码正常工作。我创建了一个全局数组变量z1=[];,然后使用唯一引用键r将ZeroClipboard对象存储在数组中,并使用以下代码。 (这本身可能是邪恶的,但它有效。)

function zc(r){
    var a="RP"+r,b="RDC"+r,c="RP"+r;
    z1[r]=new ZeroClipboard.Client();
    z1[r].addEventListener('mouseDown',function(client){z1[r].setText(document.getElementById(c).innerHTML);});
    z1[r].addEventListener('complete',function(client,text){$('#'+a).aH("#D6EBFF",1000);});
    z1[r].glue(a,b);}

我最近意识到将z1作为一个全局变量是多么的邪恶,所以我试图修改我的方式并创建一个对象以限制整个业务。但它不起作用......

我做了以下事情:

var zc={
    z1: [],

    add:function(r){
        var a="RP"+r,b="RDC"+r,c="RP"+r;
        z1[r]=new ZeroClipboard.Client();
        z1[r].addEventListener('mouseDown',function(client){z1[r].setText(document.getElementById(c).innerHTML);});
        z1[r].addEventListener('complete',function(client,text){$('#'+a).aH("#D6EBFF",1000);});
        z1[r].glue(a,b);}
}

我现在正在调用zc.add(r)而不是之前的zc(r)

我得到的Firebug错误是z1 is not defined。为什么我的'add'方法无法看到我的'z1'属性?

[哦,之前有人问我为什么不将z1放在zc中,因为我从代码中的其他位置访问z1,所以我我将向对象添加更多方法。)

3 个答案:

答案 0 :(得分:2)

z1[r]更改为this.z1[r]

我可能还建议将其设置为范围中的变量以避免查找。

var zr = this.z1[r] = new ZeroClipboard.Client();
zr.addEventListener()

答案 1 :(得分:2)

  1. z1替换为this.r1
  2. 也许我误解了你的努力,但zc也是一个全局变量(似乎)

答案 2 :(得分:0)

zc是你的第二个代码块中的对象文字,所以我不认为匿名函数知道该对象的成员(即它们不在同一个闭包中)。您应该创建一个新函数:

var ZC = function () {
    var z1  = [];
    this.add = function(r){
        var a="RP"+r,b="RDC"+r,c="RP"+r;
        z1[r]=new ZeroClipboard.Client();
        z1[r].addEventListener('mouseDown',function(client){z1[r].setText(document.getElementById(c).innerHTML);});
        z1[r].addEventListener('complete',function(client,text){$('#'+a).aH("#D6EBFF",1000);});
        z1[r].glue(a,b);
    };
};
var _zc = new ZC();
_zc.add();

这样做的好处是保持z1私有(在函数范围之外无法访问)。