Подтвердить что ты не робот

Создать новый объект javascript из переменной

Я хотел бы создать новый объект в javascript (используя простое наследование), чтобы класс объекта определялся из переменной:

var class = 'Person';
var inst = new class

любые идеи?

4b9b3361

Ответ 1

Вы можете сделать что-то вроде

function Person(){};
var name = 'Person';
var inst = new this[name]

Ключ просто ссылается на объект, которому принадлежит функция, которая является конструктором. Это отлично работает в глобальной области действия, но если вы сбрасываете код внутри функции, вам может потребоваться изменить ссылку, потому что this, вероятно, не работает.

EDIT: передать параметры:

function Person(name){alert(name)};
var name = 'Person';
var inst = new this[name]('john')

Ответ 2

Вот как я это делаю. Как и ответ медитера.

var className = 'Person'
// here the trick: get a reference to the class object itself
// (I've assumed the class is defined in global scope)
var myclass = window[className];
// now you have a reference to the object, the new keyword will work:
var inst = new myclass('params','if','you','need','them');

Ответ 3

Чтобы улучшить ответ выше, медитер:

Для вызова функции:

Вы просто замените 'this' областью, содержащей класс, к которому вы обращаетесь, например, если класс написан в глобальной области, как показано ниже:

function Person(name){alert(name)};
var name = 'Person';

function classMaker(){
  var inst = new window[name]('john');
}

classMaker();

Ответ 4

У меня была аналогичная проблема в Node.js, когда мне приходилось динамически создавать разные объекты-обработчики в зависимости от данных. Сначала я собрал все доступные обработчики, которые были реализованы как отдельные модули, в объекте. В простом случае это может быть жестко запрограммировано так.

var handlers = {
  handlerX : require('HandlerX'),
  handlerY : require('HandlerY')
};

Затем, когда мне приходилось создавать экземпляр обработчика, я сделал это следующим образом:

var handlername = getHandlerName()
var handler = new handlers[handlername]();

Конечно, это работает только если вы знаете или можете программно определить список всех объектов, которые вам нужно создать.