欢迎来到天天文库
浏览记录
ID:30775861
大小:276.14 KB
页数:14页
时间:2019-01-03
《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;i6、}};functionNotebook(){}Notebook,prototype.printName=function(){console.log(,thisisanotebook');};functionPencil(){}Pencil,prototype.printName=function(){console.log(,thisisapencil,);};functionStudent(){}Student.prototype,write=function(notebook,pencil){if(!notebook7、8、!penc订){thrownewE9、rrorCDependenciesnotprovided!');ijconsole.logCwriting...');};//提供notebook依赖cachednotebook,]=newNotebook();//提供pencil依赖cache['pencil']=newPencil();varstudent=newStudent();injector.resolve(student,write,student);//writing…有时候为了保证良好的封装性,也不一定要把cache对象暴露给外界作用域,更多的时候是以闭包变量或者私有屈性的形式存在的:fun10、ctionInjector(){thi
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
此文档下载收益归作者所有