Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/415.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从javascript中的字符串名称获取对象类_Javascript_String_Class_Object_Get - Fatal编程技术网

从javascript中的字符串名称获取对象类

从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>,

我想从Javascript中的名称获取一个对象。 我正在开发一个需要加载不同上下文的应用程序,我正在尝试使用“继承”jquery插件加载不同的类。除了需要实例化一个类时,我不能,因为我只有类的名称,而没有直接的对象

基本上,我希望找到类似“getClass(String name)”的内容。有人能帮我吗

不要使用
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()
可以用来执行任意代码,这可能会带来安全风险。它提供的功率远远超过您的需要。你为什么不能用地图?你说的泛型是什么意思?你指的是什么上下文?如果你提供更多的信息,我们可以帮助你更好。我完全错了,你的伎俩可以根据我的需要来运用。谢谢@如果您采取适当的措施,FelixKling
eval()
就不能用于执行任意代码:@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