JS反射与依赖注入使用案例分析

这次给大家带来JS反射与依赖注入使用案例分析,JS反射与依赖注入使用的注意事项有哪些,下面就是实战案例,一起来看一下。

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

首先定义两个方法:

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

登录后复制

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

var doSomething = function(other) {  var s = service();  var r = router();};

登录后复制

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

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");

登录后复制

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

var injector ={    dependencies: {},    register: function(key, value) {      this.dependencies[key] = value;    },    resolve:function(deps, func, scope) {      var args = [];      for(var i=0; i<deps.length, d=deps[i]; i++) {        if(this.dependencies[d]) {          args.push(this.dependencies[d]);        } else {          throw new Error('Can't resolve ' + d);        }      }      return function() {        func.apply(scope || {}, args.concat(Array.prototype.slice.call(arguments, 0)));      }    }};

登录后复制

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

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

但是依旧存在几点问题:

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

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

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

var injector ={    dependencies: {},    register: function(key, value) {      this.dependencies[key] = value;    },    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(/^functions*[^]*(s*([^]*(s*([^]*))/m)[1].replace(/ /g, '').split(',');        scope = arguments[1] || {};      }      return function() {        var a = Array.prototype.slice.call(arguments, 0);        for(var i=0; i<deps.length; i++) {          var d = deps[i];          args.push(self.dependencies[d] && d != '' ? self.dependencies[d] : a.shift());        }        func.apply(scope || {}, args);      }    }};

登录后复制

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

调用方式可以如下:

injector.resolve(['service,,router', function(service, router) {}]);

登录后复制

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

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

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

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

var injector = {  dependencies: {},  register: function(key, value) {    this.dependencies[key] = value;  },  resolve: function(deps, func, scope) {    var args = [];    scope = scope || {};    for(var i=0; i<deps.length, d=deps[i]; i++) {      if(this.dependencies[d]) {        scope[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");

登录后复制

相信看了本文案例你已经掌握了方法,更多精彩请关注【创想鸟】其它相关文章!

推荐阅读:

如何在微信小程序内开发验证码密码输入框功能

如何使用js统计页面标签数量

以上就是JS反射与依赖注入使用案例分析的详细内容,更多请关注【创想鸟】其它相关文章!

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

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2752896.html

(0)
上一篇 2025年3月8日 06:30:40
下一篇 2025年2月23日 04:22:24

AD推荐 黄金广告位招租... 更多推荐

相关推荐

发表回复

登录后才能评论