Как сделать объект 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();
6 59

6 ответов:

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

var myObject = window[classNameString];

..?

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

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();

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

var obj = new this[classNameString]();

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

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

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

Edit

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

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

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

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

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

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

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

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;
};

Если classNameString зайди из безопасного источника вы можете использовать

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

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