我想在节点中动态创建一个对象。为此,我使用了这样的代码。 在节点服务器中使用eval是个坏主意吗?
var a1 = require(./a1.js),
a2 = require(./a2.js),
...
aN = require(./aN.js);
function createObj(pObjName, pObjValue){
var tmp = new eval(pObjName)(pObjValue);
//where pObjName is a1 or a1 or .... or aN
}
答案 0 :(得分:3)
根据您展示的内容,无需使用eval
:
const Classes = {
a1 : require('./a1'),
a2 : require('./a2'),
...
};
function createObj(pObjName, pObjValue){
var tmp = new Classes[pObjName](pObjValue);
...
}
答案 1 :(得分:1)
好像你想用一组属性创建对象?
您可能需要查看Object.create()-method
答案 2 :(得分:0)
如果你想节省宣布所有这些依赖项的时间,你甚至可以编写一个函数而不使用eval
来更有效地处理案例:
function createObj(pObjName, pObjValue) {
var tmp = new (require('./' + pObjName))(pObjValue);
// ...
}
请注意,只有在createObj()
保证使用您所期望的pObjName
调用时,这才是安全的,否则您需要先验证它,可能是这样的:< / p>
function createObj(pObjName, pObjValue) {
if (!/^a\d$/.test(pObjName)) {
throw new TypeError('invalid name')
}
var tmp = new (require('./' + pObjName))(pObjValue);
// ...
}