本文實(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); } }};
新聞熱點(diǎn)
疑難解答
圖片精選