[英]Object instantiation using eval in JavaScript
简短的问题,如果这可行(并且可行):
eval("new " + generator.className + "(" + generator.constructorArgs.join(", ") + ")");
为什么这样不起作用:
eval(generator.className + ".prototype.constructor.apply({}, generator.constructorArgs);");
第二个表达式始终返回undefined,但我认为它应该起作用。 我在像这样的虚拟对象上尝试过:
var dummy = function () {};
另外,在这种情况下,有什么方法可以避免使用eval吗?
谢谢,
亚历克斯
好吧,我认为问题在于您的构造函数未返回任何内容。
当使用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
值来应用函数,因为当您使用new
运算符时,新创建的对象将继承自其构造函数的原型,例如:
new Bar() instanceof Bar; // true
Bar.call({}) instanceof Bar; // false
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.