Доступ к внуку переменной (parent.child.grandchild) без точек и одной пары скобок - PullRequest
5 голосов
/ 18 июня 2011

Я создаю класс, связанный с canvas, с таблицей преобразования. Таблица преобразования может быть отредактирована пользователем. (Не очень актуально, но, может быть, вы хотите знать, почему):

cLayout = function(option) {
    //obtaining the canvas (el) here
    this.setup = function(option) {
        t=this.table;
        for (var p in t)
        {
            el[t[p][0]] = option[p]||t[p][1]
        }
    }
    this.setup(option)
}

cLayout.prototype.table = {
    width:[['style']['width'],"100%"],
    height:['style'['height'],"100%"],
    bg:[['style']['backgroundColor'],""],
    position:[['style']['position'],"absolute"],
    left:['style'['left'],"0px"],
    top:['style'['left'],"0px"]
}

Пример:

var b = new cLayout({left:'10%',width:'90%'})

Реальный вопрос:

Обычно я бы использовал el['style']['width'] для установки el.style.width. Но я хочу использовать el[something] без второй пары скобок: я хочу, чтобы имя свойства было полностью переменным (я также хочу иметь возможность установить el['innerHTML']). Итак, есть ли способ получить внука, используя a[b], без использования a[b][c]?

P.S. Конечно, я не хочу использовать eval.

1 Ответ

3 голосов
/ 18 июня 2011

Нет, это невозможно. Если у вас есть вложенные объекты, вы не можете просто пропустить уровень.

Вы можете написать вспомогательную функцию, которая принимает строку типа "child.grandchild" и устанавливает соответствующее свойство:

function setProp(obj, prop, val) {
    var parts = prop.split('.');
    while(parts.length > 1) {
        obj = obj[parts.shift()];
    }
    obj[parts.shift()] = val;
}

(Вам также следует проверить, доступно ли определенное свойство.)

Тогда ваш код может выглядеть так:

var cLayout = function(option) {
    //obtaining the canvas (el) here
    this.setup = function(option) {
        for(var p in this.table) {
            setProp(el, this.table[p][0], option[p]||t[p][1]);
        }
    }
    this.setup(option)
}

cLayout.prototype.table = {
    width:['style.width',"100%"],
    height:['style.height',"100%"],
    //...
}
...