Объекты JavaScript, два вопроса - PullRequest
1 голос
/ 26 января 2011

Я работаю над плагином jQuery, и у меня есть несколько вопросов о некоторых объектах, которые я использую.Я обещаю, что потратил около часа на поиск в Google, но, видимо, мои поисковые термины были недостаточно точными.Вот пример:

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
    },
}

Теперь он скажет мне, что 'startHex' в 'parseInt (startHex, 16)' не определено.Можно ли ссылаться на другой атрибут в объекте из родственного атрибута, и если да, то как вы это делаете?

Мой другой вопрос: поскольку все атрибуты 'rgba' сами имеют одинаковые атрибуты, какЯ использую массив с циклом для ссылки на каждый из них?Например, это не будет работать:

var colors = ['red','green','blue'];
for(i in colors) {
    alert(rgba.colors[i].diffDec);
}

По очевидным причинам, потому что для этого кода должен существовать атрибут с именем 'colors' для объекта 'rgba'.Я думал об использовании eval ():

var colors = ['red','green','blue'];
for(i in colors) {
    alert(rgba.eval(colors[i]).diffDec);
}

Но он говорит мне, что eval () не является атрибутом 'rgba'.Любые предложения о том, как я могу это сделать (кроме фактического создания атрибута 'colors' в 'rgba')?

Спасибо!

Ответы [ 3 ]

3 голосов
/ 26 января 2011

Вы не можете получить доступ к другим свойствам таким образом. но то, что вы можете сделать, это:

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 голос
/ 26 января 2011

Первое, что нужно понять, это то, что область видимости в 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);
}

Строки - это имена свойств, а не сами свойства.

0 голосов
/ 26 января 2011

Вы задаете два вопроса здесь:

  1. Ответ на первый вопрос & mdash; один о константном синтаксисе объекта & mdash; является то, что вы не можете ссылаться на другие элементы объекта из кода инициализации. Другими словами, объект на самом деле еще не существует. Вы можете инициализировать его одним выражением, а затем запустить функцию, которая заполняет необходимые вам дополнительные свойства.

  2. Ошибка о том, что eval () не является атрибутом "rgba", ну, это не атрибут "rgba". В вашем коде нет функции eval. Глобальная функция "eval" - это просто: global.

Наконец, тот цикл, который вы говорите, не работает, я уверен, что он работает. Кажется, в этом нет ничего плохого, кроме того факта, что это цикл "для ...". Они действительно не должны использоваться для итерации массива, если вы действительно не знаете, почему вы хотите это сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...