欢迎来到天天文库
浏览记录
ID:30775884
大小:155.56 KB
页数:12页
时间:2019-01-03
《javascript技术栈中的四种依赖注入小结_基础知识》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、Javascript技术栈中的四种依赖注入小结作为面向对象编程中实现控制反转(InversionofControl,下文称IoC)最常见的技术手段之_,依赖注入(DependencyInjection,下文称DI)可谓在OOP编程中大行其道经久不衰。比如在J2EE中,就有大名鼎鼎的执牛耳者SpringeJavascript社区中口然也不乏一些积极的尝试,广为人知的AngularJS很大程度上就是基于DT实现的。遗憾的是,作为一款缺少反射机制、不支持Annotation语法的动态语言‘Javascript长期以
2、來都没有属于自lA的Spring框架。当然,伴随着ECMAScript草案进入快速迭代期的春风,Javascript社区屮的各种方言、框架可谓群雄并起,方兴未艾。可以预见到,优秀的JavascriptDl框架的岀现只是早晚的事。本文总结了Javascript中常见的依赖注入方式,并以inversify,js为例,介绍了方言社区对于Javascript中DT框架的尝试和初步成果。文章分为四节:一.基于Injcctor^Cache和函数参数名的依赖注入二.AngularJS中基丁•双Injector的依赖注入三.
3、TypeScript中基于装饰器和反射的依赖注入四.inversify,jsJavascript技术栈屮的IoC容器一.基于Injector、Cache和函数参数名的依赖注入尽管Javascript中不原生支持反射(Reflection)语法,但是Function,prototype上的toString方法却为我们另辟蹊径,使得在运行时窥探某个函数的内部构造成为可能:toString方法会以字符串的形式返冋包含function关键字在内的整个函数定义。从这个完整的函数定义出发,我们可以利用正则表达式提取出该函
4、数所需要的参数,从而在某种程度上得知该函数的运行依赖。比如Student类_Jtwrite方法的函数签名write(notebook,penci1)就说明它的执行依赖于notebook和penc订对彖。因此,我们可以首先把notebook和penc订对象存放到某个cache中,再通过injector(注入器、注射器)向write方法提供它所需要的依赖:varcache={};//通过解析Function,prototype.toString()取得参数名functiongetParamNames(func){
5、//正则表达式出自http://krasimirtsoncv.com/blog/articlc/Dependcncy-injcction-in-JavaScriptvarparamNames=func.toString().match(厂function's*]飞(]*(s*([飞)]*))/m)[1];paramNames=paramNames.replace(//g,");paramNames=paramNames.splitC/);returnparamNames;}varinjector二{//
6、将func作用域中的this关键字绑定至(Jbind对象上,bind对象可以为空resolve:function(func,bind){//取得参数名varparamNames二getParamNames(func);varparams二[];for(vari=0;i7、tionNotebook(){}Notebook.prototype,printNamc二function(){console.logCthisisanotebook");};functionPencil(){}Pencil.prototype,printNamc二function(){console.logCthisisapenciT);};functionStudent(){}Studcnt.prototype,write二function(notebook,pencil){if([notebook8、9、[10、pencil){thrownewError(5Dependenciesnotprovided!");}console.log(,writing...');};//捉供notebook依赖cachenotebook5]=newNotebook();//提供penc订依赖cache「pencil']二newPencil();varstudent二newStudcnt();injector.resolve
7、tionNotebook(){}Notebook.prototype,printNamc二function(){console.logCthisisanotebook");};functionPencil(){}Pencil.prototype,printNamc二function(){console.logCthisisapenciT);};functionStudent(){}Studcnt.prototype,write二function(notebook,pencil){if([notebook
8、
9、[
10、pencil){thrownewError(5Dependenciesnotprovided!");}console.log(,writing...');};//捉供notebook依赖cachenotebook5]=newNotebook();//提供penc订依赖cache「pencil']二newPencil();varstudent二newStudcnt();injector.resolve
此文档下载收益归作者所有