简短的问题,如果这样做(并且确实如此):
eval("new " + generator.className + "(" + generator.constructorArgs.join(", ") + ")");
为什么这不起作用:
eval(generator.className + ".prototype.constructor.apply({}, generator.constructorArgs);");
第二个表达式总是返回undefined,但在我看来它应该有效。我在虚拟对象上试过它,如:
var dummy = function () {};
另外,在这种情况下,有什么办法可以避免使用eval吗?
谢谢,
亚历
答案 0 :(得分:2)
好吧,我认为问题是你的构造函数没有返回任何东西。
当您使用new
运算符时,如果构造函数不返回对象,则隐式返回this
值,即新创建的对象,例如:
function Foo () {
this.foo = 'bar';
}
new Foo(); // { foo: 'bar' }
如果使用call / apply调用该函数,它将产生undefined
,因为根本没有返回值:
Foo.call({}); // undefined
因此,解决方案是在构造函数上返回this
值,例如:
function Bar() {
this.bar = 'baz';
//..
return this;
}
Bar.call({}); // { bar: 'baz' }
另外,请记住,使用new
运算符并不完全等同于应用使用新对象作为this
值的函数,因为当您使用{{ 1}}运算符,新创建的对象将从其构造函数的原型继承,例如:
new