来自对象的可执行代码(最好没有eval())

时间:2015-04-03 11:47:15

标签: javascript backbone.js

我有这个代码在骨干项目中执行:

main.key1 = new view.a.b.c({prop: val});
main.key2 = new view.x.y.z({prop: val});
//and so on, about 10 views with about 5 identical properties

我在主对象中定义了这样的对象:

var main = this;    
var viewmap = {key1: 'view.a.b.c', key2: 'view.x.y.z'} // and so on

我想要的是使用我的对象替换上面的代码,因为视图必须来自地图。

我不是100%反对eval(),但我不想使用它。但是,如果这是唯一的方法,我会接受它。问题是,我甚至不确定如何将eval()用于此目的。

我尝试过类似的事情:

for(view in viewmap){
    main[view] = eval('new ' + viewmap[view] + '({prop: val});');
}

但它没有用。

请帮忙。

1 个答案:

答案 0 :(得分:1)

.处拆分字符串,然后在生成的数组上循环并使用括号表示法查找下一个对象,您最终得到的代码看起来像这样

function getObj(base, path) {
    var arr = path.split('.'), // ["view", "a", "b", "c"]
        i;
    for (i = 1; i < arr.length; ++i) // start from 1 to ignore "view"
        if (!(base = base[arr[i]]))
            break; // error handling?
    return base;
}
// now your loop that uses `new` on the result of the invocation of the function
var viewPath;
for(viewPath in viewmap){
    main[viewPath] = new (getObj(view, viewmap[viewPath]))({prop: val});
}

注意getObj电话周围的额外一对括号,以便口译员不会将此与new

混淆