我的javascript项目中有2个函数构造函数。如下所示
function Test(){
this.x = 45;
}
function S(){
this.y=78;
this.f = new Test()
}
现在我必须根据类型而不是名称来访问“ S”的属性。这是因为我的系统中有一个配置文件,该文件以
之类的对象格式列出了要访问的变量[<Object of TYPE to create>,<Object of TYPE to access from created object>]
[S<classname>,Test<property type>]
以上表示我必须创建"S"
类型的Object并从创建的对象访问TEST
type属性。
到目前为止,我一直在做以下事情
let s1 = new S()
s1[Object.keys(s1).filter(item=>s1[item] instanceof Test)[0]]
但是,我担心我的Class可能包含15-20个不同类型的变量,并且对于其他每个配置对象重复这样做可能不是一个好习惯。还有其他我不希望使上述工作更轻松的方法吗?
答案 0 :(得分:0)
我是这样想的。在您的应用程序中定义的类型成为更大的组之前,您的代码将运行良好,并且您希望避免一系列条件约束。
在不了解应用程序如何读取配置文件以及对象的结构的情况下,仅当Test()
在全局范围内时,以下内容才有效。
提取instanceof
的右侧成为变量,而不是硬编码的函数名。我们可以做到
s1[Object.keys(s1).filter(item=>s1[item] instanceof eval("Test"))[0]]
或
s1[Object.keys(s1).filter(item=>s1[item] instanceof window["Test"])[0]]
用您从文件中读取的配置替换"Test"
文字。
第一个动态评估字符串形式的JavaScript代码的方法将返回Test()函数。
第二种方法具有在窗口对象中定义的名称“ Test”的属性,即函数Test()。