繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM