所以我一直想让一个想法起作用,但是我似乎无法弄清楚。我想做以下事情。
// my old fasion code but not very flexibale
function runCode() {
var x = new myObject();
return x.run();
}
我真正想做的事.....
// pass in string paramater of object to create
// objName is the name of an object string to new like "myObject"
function runCode(objNameToUse) {
var x = new Object(objNameToUse);
return x.run();
}
runCode("myObject");
我该如何使用javascript做类似的事情?
答案 0 :(得分:0)
您可以将可用构造函数的名称映射到构造函数本身,就像使用对象一样:
var someConstructors = Object.create(null);
someConstructors.myObject = myObject;
…
function runCode(objNameToUse) {
var constructor = someConstructors[objNameToUse];
var x = new constructor();
return x.run();
}
runCode("myObject");
Object.create(null)
是一个不继承Object.prototype
属性的对象,因此您没有像hasOwnProperty
这样的多余“键”。重要,因为通常的原因是您要基于控件外部的字符串创建对象(例如,用户输入);在许多其他情况下,您可以将myObject
作为函数而不是名称直接传递给runCode
。
因此,请确保这不是您真正想要的“灵活性”:
function runCode(constructor) {
var x = new constructor();
x.run();
}
runCode(myObject);
答案 1 :(得分:-3)
如果您绝对确定,您可以随时100%控制将哪个类名传递给函数,则可以使用eval
:
class myObject {
run() {
console.log('run');
}
}
function runCode(objNameToUse) {
var x = new (eval(objNameToUse))();
return x.run();
}
runCode('myObject');