我正在为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的实现方式以及工作方式。它与问题无关。问题是:
是否可以获取构造函数代码,因为函数可以使用?
答案 0 :(得分:0)
不应将参数名称视为标识要注入到constructor
中的内容的可靠方法。如您所见,JavaScript并非旨在让您以适当的方式检索这些名称,并且如果您在浏览器环境中,则可能在释放代码之前将代码缩小了,从而导致名称丢失。
JavaScript中的依赖注入机制通常依赖于元数据,例如Angular的元数据。它使用TypeScript装饰器在Map
中存储排序的参数 types ,其关键字是类本身,而值是类的Array
。然后,可以通过简单的引用比较(或instanceof
)来检查可注入对象池中是否已实例化了所需的类。
FYI回送是另一个使用TypeScript和依赖项注入的后端框架(在Node.js中运行)。