我正在开发一个jQuery插件,我对我正在使用的一些对象有一些疑问。我保证我花了大约一个小时搜索谷歌,但显然我的搜索条件不够具体。这是一个例子:
var rgba = {
red = {
startHex : 'FF',
startDec : parseInt(startHex,16),
endHex : '00',
endDec : parseInt(endHex,16),
diffDec : endDec - startDec
},
green = {
startHex : 'FF',
startDec : parseInt(startHex,16),
endHex : '00',
endDec : parseInt(endHex,16),
diffDec : endDec - startDec
},
blue = {
startHex : 'FF',
startDec : parseInt(startHex,16),
endHex : '00',
endDec : parseInt(endHex,16),
diffDec : endDec - startDec
},
}
现在它会告诉我'parseInt(startHex,16)'中'startHex'未定义。是否可以从兄弟属性引用对象中的另一个属性,如果是这样,你怎么做?
我的另一个问题是,由于'rgba'的属性本身都具有相同的属性,我如何使用带有for循环的数组来引用其中的每一个?例如,这不起作用:
var colors = ['red','green','blue'];
for(i in colors) {
alert(rgba.colors[i].diffDec);
}
由于显而易见的原因,因为对于这个代码,'rgba'对象应该有一个名为'colors'的属性。我想过使用eval():
var colors = ['red','green','blue'];
for(i in colors) {
alert(rgba.eval(colors[i]).diffDec);
}
但它告诉我eval()不是'rgba'的属性。关于我如何做到这一点的任何建议(除了在'rgba'下实际创建属性'colors')?
谢谢!
答案 0 :(得分:3)
您无法以这种方式访问其他属性。但你能做的是:
function Color(startHex, endHex) {
this.startHex = startHex;
this.endHex = endHex;
this.startDec = parseInt(startHex,16);
this.endDec = parseInt(endHex,16);
this.diffDec = this.endDec - this.startDec;
}
var rgba = {
red : new Color('FF','00'),
green : new Color('FF','00'),
blue : new Color('FF','00')
}
至于你的第二部分,你正在添加一个不必要的步骤。只需使用:
for(prop in rgba) {
alert(rgba[prop].diffDec);
}
请记住,使用javascript,这两个是等价的:
myobject.myproperty
和
myobject["myproperty"]
答案 1 :(得分:1)
要意识到的第一点是JavaScript中的范围与其他一些面向对象的语言不同。 JS中的范围不是基于对象,而是基于函数。因此,最好的办法是创建一个创建颜色的函数,如下所示:
var makeColor = function(startHexValue, endHexValue) {
var start = parseInt(startHexValue, 16);
var end = parseInt(endHexValue, 16);
return {
startHex: startHexValue,
startDec: start,
endHex: endHexValue,
endDec: end,
diffDec: start - end
};
};
(当然,如果你真的想要,你可以很容易地将它改成构造函数。)然后你的rgba对象变成:
var rgba = {
red : makeColor("FF", "0"),
green : makeColor("FF", "0"),
blue : makeColor("FF", "0")
};
然后你的最后一部分应该是:
var colors = ['red','green','blue'];
for(name in colors) {
alert(rgba[name].diffDec);
}
字符串是属性的名称,而不是属性本身。
答案 2 :(得分:0)
你在这里问两个问题:
第一个问题的答案 - 关于对象常量语法的答案 - 是你不能从初始化代码中引用对象的其他元素。换句话说,该对象尚未存在。您可以使用一个表达式初始化它,然后运行一个函数来填充您需要的其他属性。
关于“eval()”的错误不是“rgba”的属性,嗯,它不是“rgba”的属性。您的代码中没有任何名为“eval”的函数。全球“评估”功能就是:全球。
最后,你说的那个循环不起作用,好吧,我打赌它确实如此。它对我来说似乎没有任何问题,除了它是一个“for ... in”循环的事实。那些真的不应该用于遍历数组,除非你真的知道你为什么要这样做。