Как сделать объект 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 ответов:
вот более надежное решение, которое будет работать с пространственными функциями:
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]
Если 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; };