Javascript:数组作为对象属性(&;ZeroClipboard)
好吧,我承认一开始我有点不知所措 我有一些代码工作得很好。我创建了一个全局数组变量Javascript:数组作为对象属性(&;ZeroClipboard),javascript,arrays,object,properties,Javascript,Arrays,Object,Properties,好吧,我承认一开始我有点不知所措 我有一些代码工作得很好。我创建了一个全局数组变量z1=[]然后使用唯一引用键r和以下代码将ZeroClipboard对象存储在数组中。(这本身可能是邪恶的,但它起了作用。) 我最近意识到,将z1作为一个全局变量是多么邪恶,所以我正试图改变我的方式,创建一个对象来约束整个业务。但它不起作用 我已经做了以下工作: var zc={ z1: [], add:function(r){ var a="RP"+r,b="RDC"+r,c="
z1=[]
然后使用唯一引用键r和以下代码将ZeroClipboard对象存储在数组中。(这本身可能是邪恶的,但它起了作用。)
我最近意识到,将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
。为什么我的'add'
方法看不到我的'z1'
属性
[哦,在有人问我为什么不把
z1
放在zc
中之前,这是因为我从代码中的其他地方访问z1
,所以我要向对象添加更多的方法。)将z1[r]
更改为this.z1[r]
我还建议将其设置为范围中的变量,以避免查找
var zr = this.z1[r] = new ZeroClipboard.Client();
zr.addEventListener()
将
z1[r]
更改为this.z1[r]
我还建议将其设置为范围中的变量,以避免查找
var zr = this.z1[r] = new ZeroClipboard.Client();
zr.addEventListener()
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保持私有(在函数的作用域之外无法访问)。
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私有(在函数范围之外无法访问)的优点
z1
替换为this.r1
zc
也是一个全局变量(似乎)z1
替换为this.r1
zc
也是一个全局变量(似乎)“所以我认为匿名函数不知道该对象的成员”-这可能是因为您没有正确地表达它。
添加属于zc
对象(定义为对象文字)的函数大多数人肯定知道zc
属性。add
属性被分配了一个匿名函数这一事实并没有改变这一点。是的,我试图在paren中澄清这一点(它们不共享相同的闭包)。它仍然可以通过上下文访问成员(此),但这是唯一的方法,对吗?我不确定我是否理解你所说的“这是唯一的方法”是什么意思。作为任何函数,它也可以访问其定义范围内的所有变量,将其简化一点。我的意思是,如果通过回调调用同一个函数,从而更改add()的上下文然后使用this
调用将失败,因为它不再指向zc
文本。“因此我认为匿名函数不知道该对象的成员”-这一点。或者可能是您没有正确使用它。添加属于zc
对象(定义为对象文本)的函数大多数人肯定知道zc
属性。add
属性被分配了一个匿名函数这一事实并没有改变这一点。是的,我试图在paren中澄清这一点(它们不共享相同的闭包)。它仍然可以通过上下文访问成员(此),但这是唯一的方法,对吗?我不确定我是否理解你所说的“这是唯一的方法”是什么意思。作为任何函数,它也可以访问其定义范围内的所有变量,将其简化一点。我的意思是,如果通过回调调用同一个函数,从而更改add()的上下文然后使用调用此
将失败,因为它不再指向zc
文本。谢谢,全部:)毕竟,即使它本身工作,它也不会做我希望它做的事情,因为ZeroClipboard客户端事件侦听器找不到z1数组来将文本复制到剪贴板。C'est la vie:)谢谢,全部:)毕竟这是因为,即使它本身可以工作,它也不会做我希望它做的事情,因为ZeroClipboard客户端EventListeners找不到z1数组来将文本复制到剪贴板。C'est la vie:)