Ответ 1
Будет ли это работать, если вы сделали что-то вроде этого:
var myObject = window[classNameString];
..
Вот что я пытаюсь сделать - это псевдокод и не работает. Кто-нибудь знает, как это сделать по-настоящему:
// 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();
Будет ли это работать, если вы сделали что-то вроде этого:
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 сами являются объектами, точно также как и строки, которые также являются объектами.
Вот лучший способ получить глобальную область действия, которая работает в строгом режиме, а также в не-браузерных средах JS:
var global;
try {
global = Function('return this')() || (42, eval)('this');
} catch(e) {
global = window;
}
// and then
var obj = new global[classNameString]
Если MyClass является глобальным, вы можете получить к нему доступ как свойство объекта окна (при условии, что ваш код запущен в браузере), используя нотацию подстроки.
var myObject = new window["MyClass"]();
Вот улучшенная версия метода 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;
};
Если classNameString
поступает из защищенного источника, вы можете использовать
var classNameString = 'MyClass';
var myObject = eval("new " + classNameString + "()");
Это решение работает с пространствами имен и не зависит от платформы (браузер/сервер).