5

我正在使用一种转换表构建一个与画布相关的类。用户可以编辑转换表。(不是很相关,但也许你想知道为什么):

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]

PS当然,我不想用eval。

4

1 回答 1

3

不,这是不可能的。如果您有嵌套对象,则不能跳过一个级别。

不过,您可以编写一个辅助函数,它接受一个类似的字符串"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%"],
    //...
}
于 2011-06-18T12:42:04.960 回答