国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

JavaScript反射與依賴注入實(shí)例詳解

2024-05-06 15:33:46
字體:
供稿:網(wǎng)友

本文實(shí)例講述了JavaScript反射與依賴注入。分享給大家供大家參考,具體如下:

對(duì)于javascript中的反射的理解,一直都是認(rèn)為,利用數(shù)組對(duì)回調(diào)函數(shù)進(jìn)行保存,之后在適當(dāng)?shù)臅r(shí)刻利用call或是apply 方法,對(duì)回調(diào)進(jìn)行調(diào)用即可,一般如下操作:

首先定義兩個(gè)方法:

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

我們有另一個(gè)函數(shù)需要用到這兩個(gè)模塊。

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

當(dāng)然,我們希望能夠能夠使用依賴注入的方式去做,把該控制權(quán)交給計(jì)算機(jī)去做,而不是人為的去調(diào)用如下:

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

那么我們可以造出一個(gè)反射方法如下:

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 用來保存回調(diào)函數(shù)集合,resolve用來調(diào)用。

這也算是一個(gè)比較成熟ok的想法。

但是依舊存在幾點(diǎn)問題:

1 resolve 在進(jìn)行調(diào)用時(shí),deps參數(shù)列表順序必須保持一致。

2 這一點(diǎn)有點(diǎn)牽強(qiáng),但是也算。在調(diào)用時(shí),需要再一次的輸入形參,而不能直接調(diào)用。

那么為了解決以上問題,給出以下解決方案:

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(/^function/s*[^]*/(/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);      }    }};
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 隆子县| 武山县| 密山市| 马龙县| 丹凤县| 从化市| 旬阳县| 大厂| 北安市| 油尖旺区| 永春县| 林芝县| 万全县| 江达县| 恩平市| 扎兰屯市| 彩票| 岫岩| 光山县| 奉化市| 综艺| 桐柏县| 巴马| 繁峙县| 英山县| 石狮市| 会东县| 凤城市| 涟水县| 黄梅县| 舟山市| 收藏| 潞西市| 桑植县| 祁门县| 柳江县| 兴仁县| 弋阳县| 南涧| 平凉市| 锡林郭勒盟|