Создание объекта с использованием eval в JavaScript - PullRequest
0 голосов
/ 07 июля 2010

Короткий вопрос, работает ли (и работает):

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

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

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

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

var dummy = function () {};

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

Спасибо
Alex

1 Ответ

2 голосов
/ 07 июля 2010

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

Когда вы используете оператор 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
...