2010-07-07 1 views
0

Короткий вопрос, если это работает (и это делает):экземпляра объекта с помощью Eval в JavaScript

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

почему это не работает:

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

Второе выражение всегда возвращает неопределенное значение, но по-моему, это должно сработать. Я попробовал это на фиктивных объектах, таких как:

var dummy = function() {}; 

Кроме того, можно ли каким-либо образом избежать использования eval в этой ситуации?

Спасибо,
Alex

ответ

2

Ну, я думаю, что проблема в том, что ваша функция конструктор ничего не возвращает.

При использовании оператора new, если функции конструктора, не возвращает объект, значение this, который вновь созданный объект возвращается неявно, например:

function Foo() { 
    this.foo = 'bar'; 
} 

new Foo(); // { foo: 'bar' } 

Если вы вызываете функция вызова/применить, он даст 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 
+0

Кроме того, 'Foo.prototype.constructor' кажется излишним и подвержен ошибкам ко мне, так как' constructor' свойство изменчиво, и я думаю, что вы хотите вызвать всегда* generator.className * функция ... – CMS

 Смежные вопросы

  • Нет связанных вопросов^_^