这就是我想要做的——这是伪代码,不起作用。有谁知道如何真正做到这一点:
// 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();
这就是我想要做的——这是伪代码,不起作用。有谁知道如何真正做到这一点:
// 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();
顺便说一句: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 是全局的,您可以使用下标表示法将其作为 window 对象的属性访问(假设您的代码在浏览器中运行)。
var myObject = new window["MyClass"]();
如果classNameString
来自安全来源,您可以使用
var classNameString = 'MyClass';
var myObject = eval("new " + classNameString + "()");
此解决方案适用于命名空间并且独立于平台(浏览器/服务器)。