создать новый объект JavaScript из переменной - PullRequest
14 голосов
/ 30 апреля 2011

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

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

Есть идеи?

Ответы [ 5 ]

29 голосов
/ 30 апреля 2011

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

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')
8 голосов
/ 30 мая 2012

Вот как я это делаю. Аналогично ответу медера.

var className = 'Person'
// here's 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');
0 голосов
/ 16 декабря 2017

Чтобы улучшить ответ выше по meder:

Для вызова с использованием функции:

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

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

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

classMaker();
0 голосов
/ 19 августа 2016

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

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

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

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

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

0 голосов
/ 30 апреля 2011

Этот разговор был действительно полезен, когда я познакомился с различными шаблонами наследования в javascript.Пример кода включен во вторую ссылку (видео вводит его).

http://alexsexton.com/?p=94

http://alexsexton.com/inheritance/demo/

http://alexsexton.com/?p=51

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...