JavaScript反射与依赖注入实例详解
本文实例讲述了JavaScript反射与依赖注入。分享给大家供大家参考,具体如下:
对于javascript中的反射的理解,一直都是认为,利用数组对回调函数进行保存,之后在适当的时刻利用call或是apply方法,对回调进行调用即可,一般如下操作:
首先定义两个方法:
varservice=function(){ return{name:'Service'}; } varrouter=function(){ return{name:'Router'}; }
我们有另一个函数需要用到这两个模块。
vardoSomething=function(other){ vars=service(); varr=router(); };
当然,我们希望能够能够使用依赖注入的方式去做,把该控制权交给计算机去做,而不是人为的去调用如下:
vardoSomething=injector.resolve('router,,service',function(a,b,c){ expect(a().name).to.be('Router'); expect(b).to.be('Other'); expect(c().name).to.be('Service'); }); doSomething("Other");
那么我们可以造出一个反射方法如下:
varinjector={ dependencies:{}, register:function(key,value){ this.dependencies[key]=value; }, resolve:function(deps,func,scope){ varargs=[]; for(vari=0;i如上代码,dependencies用来保存回调函数集合,resolve用来调用。
这也算是一个比较成熟ok的想法。
但是依旧存在几点问题:
1resolve在进行调用时,deps参数列表顺序必须保持一致。
2这一点有点牵强,但是也算。在调用时,需要再一次的输入形参,而不能直接调用。
那么为了解决以上问题,给出以下解决方案:
varinjector={ dependencies:{}, register:function(key,value){ this.dependencies[key]=value; }, resolve:function(){ varfunc,deps,scope,args=[],self=this; if(typeofarguments[0]==='string'){ func=arguments[1]; deps=arguments[0].replace(//g,'').split(','); scope=arguments[2]||{}; }else{ func=arguments[0]; deps=func.toString().match(/^function\s*[^]*\(\s*([^]*\(\s*([^]*)\)/m)[1].replace(//g,'').split(','); scope=arguments[1]||{}; } returnfunction(){ vara=Array.prototype.slice.call(arguments,0); for(vari=0;i利用正则对代码进行解析,解析出function列表参数,再进行一一自动匹配传值,那么即可解决,顺序必须一直问题,当然这也是当然最热mvvm框架AngularJs采取的方式。
调用方式可以如下:
injector.resolve(['service,,router',function(service,router){ }]);你可能注意到在第一个参数后面有两个逗号——注意
这不是笔误。空值实际上代表“Other”参数(占位符)。这显示了我们是如何控制参数顺序的。
最后还有一种方式,直接注入scope,也就是直接注入作用域,那么作用域被注入,也就不存在上述的传参顺序问题
因为不在需要传递参数,直接可以从作用域中访问到。
varinjector={ dependencies:{}, register:function(key,value){ this.dependencies[key]=value; }, resolve:function(deps,func,scope){ varargs=[]; scope=scope||{}; for(vari=0;ijavascript反射依赖注入新的理解,记录之,谨防忘记.
更多关于JavaScript相关内容感兴趣的读者可查看本站专题:《javascript面向对象入门教程》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》
希望本文所述对大家JavaScript程序设计有所帮助。