从javascript中的字符串名称获取对象类
我想从Javascript中的名称获取一个对象。 我正在开发一个需要加载不同上下文的应用程序,我正在尝试使用“继承”jquery插件加载不同的类。除了需要实例化一个类时,我不能,因为我只有类的名称,而没有直接的对象 基本上,我希望找到类似“getClass(String name)”的内容。有人能帮我吗 不要使用从javascript中的字符串名称获取对象类,javascript,string,class,object,get,Javascript,String,Class,Object,Get,我想从Javascript中的名称获取一个对象。 我正在开发一个需要加载不同上下文的应用程序,我正在尝试使用“继承”jquery插件加载不同的类。除了需要实例化一个类时,我不能,因为我只有类的名称,而没有直接的对象 基本上,我希望找到类似“getClass(String name)”的内容。有人能帮我吗 不要使用eval() 您可以将类存储在地图中: var classes = { A: <object here>, B: <object here>,
eval()
您可以将类存储在地图中:
var classes = {
A: <object here>,
B: <object here>,
...
};
:
你是说这个吗
function Person(name){
this.name = name;
}
function getClass(str_name, args){
return new (window[str_name])(args);
}
var wong2 = getClass("Person", "wong2");
alert(wong2.name); // wong2
您可以完美地使用
eval()
,而不存在安全风险:
var\u cls\u={};//用作缓存,加快以后的查找
函数getClass(名称){
如果(!\u cls\u[name]){
//缓存未就绪,请将其填满
如果(名称匹配(/^[a-zA-Z0-9_33;]+$/){
//仅当名称为单字字符串时才继续
_cls_[name]=eval(name);
}否则{
//检测到任意代码
抛出新的错误(“谁放狗出去了?”);
}
}
返回[name];
}
//用法
var x=new getClass('Hello')()//如果找不到'Hello'类,则引发异常
优点:您不必手动管理地图对象
缺点:没有。使用适当的正则表达式,任何人都不能运行任意代码 好吧,这很愚蠢,但是对我的对象名使用'eval()'函数可以做到这一点。。。为这篇无用的帖子感到抱歉…为什么使用“eval()”是错误的?我不能这样做,我的“类”是泛型的,必须在特定的上下文中加载,我不能像这样加载映射…@Celero:因为
eval()
可以用来执行任意代码,这可能会带来安全风险。它提供的功率远远超过您的需要。你为什么不能用地图?你说的泛型是什么意思?你指的是什么上下文?如果你提供更多的信息,我们可以帮助你更好。我完全错了,你的伎俩可以根据我的需要来运用。谢谢@如果您采取适当的措施,FelixKlingeval()
就不能用于执行任意代码:@ceremcem:Fair ough,如果有一个更简单、更明确的解决方案,仍然显得有些过分。但是,嘿,每个人都可以做他们想做的:)不,我有一堆类,其中一些类具有继承性,我只需要在特定情况下一次加载其中一个类。这就是为什么eval()对我来说很好…对不起,我不能,无论如何我要试试Felix Kling技术,看看…谢谢你的帮助,这基本上和eval()一样,不?Celero-不。作为全局代码运行,这将引用gobal/window对象,因此相当于window['foo']。如果您在其他范围内使用它,您可能不知道它引用了什么。它不引用作用域的变量或激活对象(即执行上下文),这是您想要的,因为它位于变量解析链上的对象的顶部。如何为导入的类执行此操作,例如从“../../mazes/components/Grid”导入网格,如果eval('yourClassName')
返回对象,那就意味着没事了。如果eval()
返回undefined
,则需要在getClass()函数的上下文中导入类。
function foo() { }
this["foo"]();
function Person(name){
this.name = name;
}
function getClass(str_name, args){
return new (window[str_name])(args);
}
var wong2 = getClass("Person", "wong2");
alert(wong2.name); // wong2