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() { |
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*([^]*)\)/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); |
} |
} |
}; |
injector.resolve([ 'service,,router' , function(service, router) { |
|
}]); |
因为不在需要传递参数,直接可以从作用域中访问到。 |
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" ); |