微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

JavaScript反射与依赖注入实例详解

本文实例讲述了JavaScript反射与依赖注入。分享给大家供大家参考,具体如下:

对于javascript中的反射的理解,一直都是认为,利用数组对回调函数进行保存,之后在适当的时刻利用call或是apply 方法,对回调进行调用即可,一般如下操作:

首先定义两个方法

rush:js;"> var service = function() { return { name: 'Service' }; } var router = function() { return { name: 'Router' }; }

我们有另一个函数需要用到这两个模块。

rush:js;"> var doSomething = function(other) { var s = service(); var r = router(); };

当然,我们希望能够能够使用依赖注入的方式去做,把该控制权交给计算机去做,而不是人为的去调用如下:

rush:js;"> var doSomething = 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");

那么我们可以造出一个反射方法如下:

rush:js;"> var injector ={ dependencies: {},register: function(key,value) { this.dependencies[key] = value; },resolve:function(deps,func,scope) { var args = []; for(var i=0; icope || {},args.concat(Array.prototype.slice.call(arguments,0))); } } };

如上代码,dependencies 用来保存回调函数集合,resolve用来调用

这也算是一个比较成熟ok的想法。

但是依旧存在几点问题:

1 resolve 在进行调用时,deps参数列表顺序必须保持一致。

2 这一点有点牵强,但是也算。在调用时,需要再一次的输入形参,而不能直接调用

那么为了解决以上问题,给出以下解决方案:

rush:js;"> var injector ={ dependencies: {},resolve: function() { var func,deps,scope,args = [],self = this; if(typeof arguments[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,'); scope = arguments[1] || {}; } return function() { var a = Array.prototype.slice.call(arguments,0); for(var i=0; icope || {},args); } } };

利用正则对代码进行解析,解析出function 列表参数,再进行一一自动匹配传值,那么即可解决,顺序必须一直问题,当然这也是当然最热mvvm框架AngularJs采取的方式。

调用方式可以如下:

rush:js;"> injector.resolve(['service,router',function(service,router) { }]);

你可能注意到在第一个参数后面有两个逗号——注意

这不是笔误。空值实际上代表“Other”参数(占位符)。这显示了我们是如何控制参数顺序的。

最后还有一种方式,直接注入scope ,也就是直接注入作用域,那么作用域被注入,也就不存在上述的传参顺序问题

因为不在需要传递参数,直接可以从作用域中访问到。

rush:js;"> var injector = { dependencies: {},value) { this.dependencies[key] = value; },resolve: function(deps,scope) { var args = []; scope = scope || {}; for(var i=0; icope[d] = this.dependencies[d]; } else { throw new Error('Can\'t resolve ' + d); } } return function() { func.apply(scope || {},Array.prototype.slice.call(arguments,0)); } } } var doSomething = injector.resolve(['service','router'],function(other) { expect(this.service().name).to.be('Service'); expect(this.router().name).to.be('Router'); expect(other).to.be('Other'); }); doSomething("Other");

javascript反射依赖注入新的理解,记录之,谨防忘记.

更多关于JavaScript相关内容感兴趣的读者可查看本站专题:《》、《》、《》、《》及《用法总结》

希望本文所述对大家JavaScript程序设计有所帮助。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐