我有这个代码在骨干项目中执行:
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});');
}
但它没有用。
请帮忙。
答案 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