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

Создание объекта JavaScript с использованием строки для определения имени класса

Вот что я пытаюсь сделать - это псевдокод и не работает. Кто-нибудь знает, как это сделать по-настоящему:

// Define the class
MyClass = Class.extend({});

// Store the class name in a string
var classNameString = 'MyClass';

// Instantiate the object using the class name string
var myObject = new classNameString();
4b9b3361

Ответ 1

Будет ли это работать, если вы сделали что-то вроде этого:

var myObject = window[classNameString];

..

Ответ 2

Здесь более надежное решение, которое будет работать с функциями, наложенными на имена:

var stringToFunction = function(str) {
  var arr = str.split(".");

  var fn = (window || this);
  for (var i = 0, len = arr.length; i < len; i++) {
    fn = fn[arr[i]];
  }

  if (typeof fn !== "function") {
    throw new Error("function not found");
  }

  return  fn;
};

Пример:

my = {};
my.namespaced = {};
(my.namespaced.MyClass = function() {
  console.log("constructed");
}).prototype = {
  do: function() {
    console.log("doing");
  }
};

var MyClass = stringToFunction("my.namespaced.MyClass");
var instance = new MyClass();
instance.do();

Ответ 3

BTW: window - ссылка на глобальный объект в браузере JavaScript. Это также this и должно работать даже в не-браузерных средах, таких как Node.js, расширения Chrome, транслируемый код и т.д.

var obj = new this[classNameString]();

Ограничение заключается в том, что вызываемый класс должен находиться в глобальном контексте. Если вы хотите применить то же самое к классу с областью действия, вам нужно сделать:

var obj = (Function('return new ' + classNameString))()

Однако на самом деле нет причин использовать строку. Функции JavaScript сами являются объектами, точно также как и строки, которые также являются объектами.

Изменить

Вот лучший способ получить глобальную область действия, которая работает в строгом режиме, а также в не-браузерных средах JS:

var global;
try {
  global = Function('return this')() || (42, eval)('this');
} catch(e) {
  global = window;
}

// and then
var obj = new global[classNameString]

От: Как получить глобальный объект в JavaScript?

Ответ 4

Если MyClass является глобальным, вы можете получить к нему доступ как свойство объекта окна (при условии, что ваш код запущен в браузере), используя нотацию подстроки.

var myObject = new window["MyClass"]();

Ответ 5

Вот улучшенная версия метода Yuriy, которая также обрабатывает объекты.

var stringToObject = function(str, type) {
    type = type || "object";  // can pass "function"
    var arr = str.split(".");

    var fn = (window || this);
    for (var i = 0, len = arr.length; i < len; i++) {
        fn = fn[arr[i]];
    }
    if (typeof fn !== type) {
        throw new Error(type +" not found: " + str);
    }

    return  fn;
};

Ответ 6

Если classNameString поступает из защищенного источника, вы можете использовать

var classNameString = 'MyClass';
var myObject = eval("new " + classNameString + "()");

Это решение работает с пространствами имен и не зависит от платформы (браузер/сервер).