javascript技术栈中的四种依赖注入详解_javascript技巧

javascript技术栈中的四种依赖注入详解_javascript技巧

ID:30775861

大小:276.14 KB

页数:14页

时间:2019-01-03

javascript技术栈中的四种依赖注入详解_javascript技巧_第1页
javascript技术栈中的四种依赖注入详解_javascript技巧_第2页
javascript技术栈中的四种依赖注入详解_javascript技巧_第3页
javascript技术栈中的四种依赖注入详解_javascript技巧_第4页
javascript技术栈中的四种依赖注入详解_javascript技巧_第5页
资源描述:

《javascript技术栈中的四种依赖注入详解_javascript技巧》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、Javascript技术栈中的四种依赖注入详解作为面向对象编程中实现控制反转(InversionofControl,下文称IoC)最常见的技术手段之_,依赖注入(DependencyInjection,下文称DI)可谓在OOP编程中大行其道经久不衰。比如在J2EE中,就有大名鼎鼎的执牛耳者SpringeJavascript社区中口然也不乏一些积极的尝试,广为人知的AngularJS很大程度上就是基于DT实现的。遗憾的是,作为一款缺少反射机制、不支持Annotation语法的动态语言‘Javascript长期以來都没有属于自lA的Spring框架。当然,伴随着E

2、CMAScript草案进入快速迭代期的春风,Javascript社区屮的各种方言、框架可谓群雄并起,方兴未艾。可以预见到,优秀的JavascriptDl框架的岀现只是早晚的事。本文总结了Javascript中常见的依赖注入方式,并以inversify,js为例,文章分为四节:一.基于Injcctor^Cache和函数参数名的依赖注入二.AngularJS中基丁•双Injector的依赖注入三.TypeScript中基于装饰器和反射的依赖注入四.inversify,jsJavascript技术栈屮的IoC容器一.基于Injector、Cache和函数参数名的依赖

3、注入尽管Javascript中不原生支持反射(Reflection)语法,但是Function,prototype上的toString方法却为我们另辟蹊径,使得在运行时窥探某个函数的内部构造成为可能:toString方法会以字符串的形式返冋包含function关键字在内的整个函数定义。从这个完整的函数定义出发,我们可以利用正则表达式提取出该函数所需要的参数,从而在某种程度上得知该函数的运行依赖。比如Student类_Jtwrite方法的函数签名write(notebook,penci1)就说明它的执行依赖于notebook和penc订对彖。因此,我们可以首先把

4、notebook和penc订对象存放到某个cache中,再通过injector(注入器、注射器)向write方法提供它所需要的依赖:varcache={};//通过解析Function,prototype.toString()取得参数名functiongetParamNames(func){varparamNames二func.toString().match(厂functions*「(]*(s*(「)]*))/m)[1];paramNames=paramNames.replace"/g,paramNames=paramNames.split(,,

5、');returnparamNames;varinjector={//将func作用域屮的this关键字绑定到bind对象上,bind对象可以为空resolve:function(func,bind){//取得参数名varparamNamcs二gctParamNamcs(func);varparams=[];for(vari=0;i

6、}};functionNotebook(){}Notebook,prototype.printName=function(){console.log(,thisisanotebook');};functionPencil(){}Pencil,prototype.printName=function(){console.log(,thisisapencil,);};functionStudent(){}Student.prototype,write=function(notebook,pencil){if(!notebook

7、

8、!penc订){thrownewE

9、rrorCDependenciesnotprovided!');ijconsole.logCwriting...');};//提供notebook依赖cachednotebook,]=newNotebook();//提供pencil依赖cache['pencil']=newPencil();varstudent=newStudent();injector.resolve(student,write,student);//writing…有时候为了保证良好的封装性,也不一定要把cache对象暴露给外界作用域,更多的时候是以闭包变量或者私有屈性的形式存在的:fun

10、ctionInjector(){thi

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。