Я хотел бы создать новый объект в javascript (используя простое наследование), чтобы класс объекта определялся из переменной:
var class = 'Person';
var inst = new class
любые идеи?
Я хотел бы создать новый объект в javascript (используя простое наследование), чтобы класс объекта определялся из переменной:
var class = 'Person';
var inst = new class
любые идеи?
Вы можете сделать что-то вроде
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')
Вот как я это делаю. Как и ответ медитера.
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');
Чтобы улучшить ответ выше, медитер:
Для вызова функции:
Вы просто замените 'this' областью, содержащей класс, к которому вы обращаетесь, например, если класс написан в глобальной области, как показано ниже:
function Person(name){alert(name)};
var name = 'Person';
function classMaker(){
var inst = new window[name]('john');
}
classMaker();
У меня была аналогичная проблема в Node.js, когда мне приходилось динамически создавать разные объекты-обработчики в зависимости от данных. Сначала я собрал все доступные обработчики, которые были реализованы как отдельные модули, в объекте. В простом случае это может быть жестко запрограммировано так.
var handlers = {
handlerX : require('HandlerX'),
handlerY : require('HandlerY')
};
Затем, когда мне приходилось создавать экземпляр обработчика, я сделал это следующим образом:
var handlername = getHandlerName()
var handler = new handlers[handlername]();
Конечно, это работает только если вы знаете или можете программно определить список всех объектов, которые вам нужно создать.
Этот разговор был действительно полезен, когда я попал в разные шаблоны наследования в javascript. Пример кода включен во вторую ссылку (видео вводит ее).