在JavaScript中使用eval进行对象实例化

时间:2010-07-07 07:01:28

标签: javascript constructor eval

简短的问题,如果这样做(并且确实如此):

eval("new " + generator.className + "(" + generator.constructorArgs.join(", ") + ")");  

为什么这不起作用:

eval(generator.className + ".prototype.constructor.apply({}, generator.constructorArgs);");

第二个表达式总是返回undefined,但在我看来它应该有效。我在虚拟对象上试过它,如:

var dummy = function () {};

另外,在这种情况下,有什么办法可以避免使用eval吗?

谢谢,
亚历

1 个答案:

答案 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