确定给定名称的类是否存在

时间:2018-03-16 09:25:18

标签: javascript ecmascript-6

这可能是一个愚蠢的问题,但我已经四处寻找,一无所获。

我有一个代码:

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。

有没有其他方法可以实现这些目标?

2 个答案:

答案 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