gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 10:25:23 25 4
gpt4 key购买 nike

我有这个代码要在 Backbone 项目中执行:

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

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

我并不是 100% 反对 eval(),但我不想使用它。但是,如果这是唯一的方法,我会采取它。问题是,我什至不确定如何使用 eval() 来实现此目的。

我尝试过类似的方法:

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

但是它不起作用。

请帮忙。

最佳答案

. 处分割字符串,然后循环生成的数组并使用括号表示法查找下一个对象,最终会得到如下所示的代码

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 混淆

关于javascript - 来自对象的可执行代码(最好没有 eval()),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29431615/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com