这就是我想要做的-这是伪代码,不起作用。有谁知道如何真正做到这一点:
// 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();
Answers:
如果您这样做是可行的:
var myObject = window[classNameString];
..?
window[classNameString]
(没有引号)。一旦MyClass
移至较低function
范围(即),即会中断。@kirk:是的,这是跨浏览器。
window[classNameString](args)
。但是,正如Crescent Fresh所述,要小心,因为在某些情况下这可能会中断。
var obj = new Home(id);
,但此方法无效:var obj = new window["Home"](id);
。我正在尝试使其工作:new window[x](id);
在哪里x = "Home"
……我得到的错误是Uncaught TypeError: window[x] is not a constructor
这是一个更强大的解决方案,可以与命名空间功能一起使用:
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();
(windows || this)
,不总是要定义窗口吗?
window || this
可以返回未定义在非浏览器环境,如果这不是由呼叫(它是不是在示例)设置。
顺便说一句: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]
this
从全局上下文调用它。window
无论您所处的环境如何,它都能正常工作,因此我认为没有理由this
比window
。
this
首选使用,因为在非浏览器环境中window
可能未定义或未定义。
window
过this
。
this
不是window
。此外,不是从全局上下文引用全局上下文的最可靠方法是top
。同样,将它注入到封闭中可能也很好。
Function('return this')()
的不是return this
。前者自动切换到全局上下文。无论上下文如何,这都有效。窗口可以被覆盖,并且仅用于浏览器。最好不知道代码执行上下文来编写跨平台代码。我给出的答案是跨平台的,无法覆盖,因此比使用更好window
。它可以在已编译的代码中工作,例如与webpack,gulp以及在节点,扩展等中一起使用。请先对其进行测试。
如果classNameString
来自安全来源,则可以使用
var classNameString = 'MyClass';
var myObject = eval("new " + classNameString + "()");
该解决方案适用于名称空间,并且独立于平台(浏览器/服务器)。
eval
听到一个坏主意,就用它就像喝醉了一样。“什么也没发生……………………我上次开车…………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………… 别那样
这是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;
};
在Firefox上,扩展有安全性规则,而Javascript控制台也有安全性规则。不要犯我在控制台中测试的错误,因为这些解决方案都不起作用。而当您从页面进行测试时,效果更好:
法语:Sur Firefox il ya desrèglesdesécuritéqui的附加辅助扩展,以及控制台Javascript。新的解决方案和市场的解决方案。在德累斯顿大学页面上的同等学历: