JavaScript对象,两个问题

时间:2011-01-26 19:38:31

标签: javascript object attributes reference

我正在开发一个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')?

谢谢!

3 个答案:

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

你在这里问两个问题:

  1. 第一个问题的答案 - 关于对象常量语法的答案 - 是你不能从初始化代码中引用对象的其他元素。换句话说,该对象尚未存在。您可以使用一个表达式初始化它,然后运行一个函数来填充您需要的其他属性。

  2. 关于“eval()”的错误不是“rgba”的属性,嗯,它不是“rgba”的属性。您的代码中没有任何名为“eval”的函数。全球“评估”功能就是:全球。

  3. 最后,你说的那个循环不起作用,好吧,我打赌它确实如此。它对我来说似乎没有任何问题,除了它是一个“for ... in”循环的事实。那些真的不应该用于遍历数组,除非你真的知道你为什么要这样做。