这可能是一个愚蠢的问题,但我已经四处寻找,一无所获。
我有一个代码:
class A {}
let className = 'A';
我需要检查className
是否与现有班级相对应。
这一切都不在全球范围内并且在node.js中运行,因此我无法使用window
我知道以下内容可行:
eval(`typeof ${className} === 'function'`);
但是我有点不愿意使用eval
(而且linter还抱怨它)
此外,我还需要将类实例化为变量,我可以使用eval进行实例化,如下所示:
let ctor = eval(className);
let object = new ctor();
但是这又使用了eval。
有没有其他方法可以实现这些目标?
答案 0 :(得分:1)
这可能表示错误的设计决策和可能的XY问题。 <div class="grid">
<div class="grid-item" v-for="i in topics">
<Tweet class="" :id="i.tweets.quoted_status_id_str" :options="{ theme: 'light' }" error-message-class="text-center text-muted tweet_err"><div class="text-center text-muted card" style="margin-top:12px;min-width:30px;"><i class="ion-social-twitter"></i>Loading tweet...</div></Tweet>
</div>
</div>
的需要通常表明了这一点。开发人员有责任跟踪正在使用的课程。
如果导出功能,则可以检查eval
。如果它们没有出口,它们可能应该是。
如果应该在单个模块中跟踪多个类,则可以使用容器,并且应该明确注册这些函数:
module.exports
函数不应该通过名称明确标识,名称应该仅用于调试目的。可以有多个具有相同const globalClassContainer = new Map;
function registerClass(cls) {
if (globalClassContainer.has(cls.name))
globalClassContainer.set(cls.name, new Set);
globalClassContainer.get(cls.name).add(cls);
}
class Foo {};
registerClass(Foo);
的函数(即使在当前范围内),也可能存在不匹配name
的函数。函数name
在Node.js中往往更安全,但不保证安全性:
name
答案 1 :(得分:0)
使用Function
构造函数
function ac(){} //new class
var f = new Function( "return typeof ac == 'function'" ) //define function to verify
f(); //returns true if class exists in the current scope
让它更通用
function ac(){} //new class
var f = function( className ){
return new Function( "return typeof " + className + " == 'function'" )(); //define function to verify and invoke the same
}
f( "ac" ); //returns true if class exists in the current scope