获取类构造函数参数名称

时间:2019-09-12 11:26:11

标签: javascript ecmascript-6 reflection dependency-injection

我正在为ES类实现某种依赖注入解决方案,为此,我需要知道类构造函数参数的确切名称。

当我获得类或类静态方法的字符串形式时,它确实给出了完整的代码(通常对于函数而言),但是对于类构造函数却没有。

class C { constructor(a, b) { }; static m(x,y) { } }
console.log(C);
console.log(C.constructor);
console.log(C.m);

产生

class C { constructor(a, b) { }; static m(x,y) { } }
ƒ Function() { [native code] }
ƒ m(x,y) { }

结果,我必须解析整个类代码以使用正则表达式提取构造器参数部分

C.toString().split(/constructor\s*[^\(]*\(\s*([^\)]*)\)/m)

是否有更干净的方法来获取构造函数参数名称?

更新: 感谢您的所有意见和评论,但是我非常清楚缩小的工作原理,TS装饰器的工作方式以及Angular / AngularJS DI的实现方式以及工作方式。它与问题无关。问题是:

是否可以获取构造函数代码,因为函数可以使用?

1 个答案:

答案 0 :(得分:0)

不应将参数名称视为标识要注入到constructor中的内容的可靠方法。如您所见,JavaScript并非旨在让您以适当的方式检索这些名称,并且如果您在浏览器环境中,则可能在释放代码之前将代码缩小了,从而导致名称丢失。

JavaScript中的依赖注入机制通常依赖于元数据,例如Angular的元数据。它使用TypeScript装饰器在Map中存储排序的参数 types ,其关键字是类本身,而值是类的Array。然后,可以通过简单的引用比较(或instanceof)来检查可注入对象池中是否已实例化了所需的类。

FYI回送是另一个使用TypeScript和依赖项注入的后端框架(在Node.js中运行)。