详细说明Javascript技术栈中的四种依赖注入
依赖注入(DI)作为面向对象编程中实现控制反转(IoC)最常用的技术手段之一,在面向对象编程中已经流行了很长时间。例如,在J2EE,有一个著名的领导人,春天。在Javascript社区中肯定有一些积极的尝试,著名的AngularJS很大程度上是基于DI的。遗憾的是,作为一种缺乏反射机制、不支持Annotation语法的动态语言,Javascript已经很久没有自己的Spring框架了。当然,随着ECMAScript草案的春风进入快速迭代期,Javascript社区中的各种方言和框架可以说是相互竞争,方兴未艾。可以预见,一个优秀的JavascriptDI框架出现只是时间问题。
总结了Javascript中常见的依赖注入方法,并以inversify.js为例。文章分为四个部分:
1.基于注入器、缓存和函数参数名的依赖注入2。AngularJS 3中基于双注入器的依赖注入。TypeScript 4中基于装饰器和反射的依赖注入。inversify.js——Javascript技术栈中的IoC容器。
1.基于注入器、缓存和函数参数名的依赖注入。
虽然Javascript本身并不支持Reflection语法,但是Function.prototype上的toString方法为我们提供了另一种方法,这使得在运行时窥探函数的内部结构成为可能:toString方法返回整个函数定义,包括字符串形式的Function关键字。从这个完整的函数定义出发,我们可以用正则表达式来提取这个函数需要的参数,从而在一定程度上可以知道这个函数的运行依赖关系。例如,Student类上write方法的函数签名write(notebook,pencil)显示其执行依赖于notebook和pencil对象。因此,我们可以首先将笔记本和铅笔对象存储在缓存中,然后通过注入器为write方法提供所需的依赖关系:
var cache={ };//获取参数名函数getparam names(func){ var param names=func . tostring()。匹配(/function \ s * [\ (] * \ (\ s * ([\)] *) \)。param NAmE=param NAmE . replace(//g ' ');paramNames=paramNames.split(',');返回参数名;}var injector={//将func作用域中的这个关键字绑定到bind对象,可以是null resolve : func(func,bind){//获取参数名var param names=getparam names(func);var params=[];for(var I=0;i paramNames.lengthI) {//通过参数名从缓存中检索对应的依赖参数push(cache[param name[I]]);}//注入依赖并执行func.apply(bind,params);}};function Notebook(){ } Notebook . prototype . print name=function(){ console . log('这是笔记本');};function Pencil(){ } Pencil . prototype . print name=function(){ console . log('这是一支铅笔');};函数Student(){ } Student . prototype . write=函数(笔记本、铅笔){ if(!笔记本||!铅笔){抛出新错误('未提供依赖项!');} console.log('正在写入.');};//提供笔记本相关缓存[' Notebook ']=new Notebook();//提供依赖铅笔的缓存[
版权声明: 详细说明Javascript技术栈中的四种依赖注入是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。