js简单实现依赖注入

所谓编程其实就是一个将简单的部分不断抽象,并将这些抽象组织起来的过程。对于Javascript来说也是如此,我们在使用JavaScript编写应用时,经常可能会用到别人的代码,比如一些著名的开源库或者框架。随着项目的增长,我们所需要依赖的模块可能会变得越来越多,那么这个时候,如何有效的组织这些模块就成了一个非常重要的问题。而依赖注入正是为了解决这个问题而诞生的。

对于Javascript的依赖注入,各大框架都有各自相应的实现,在这里简单的了解一下依赖注入的实现思路。

1、获取function的参数列表

我们可以通过正则表达式来提取function中的参数列表,具体实现如下:

function getParamNames(func){
    var paramNames = func.toString().match(/function\s+[^\(]*\(([^\)]*)\)/m)[1];
    paramNames = paramNames.replace(/\s*/,"");
    paramNames = paramNames.split(",");
    return paramNames;
}

2、根据参数列表寻找依赖

取得了参数列表,就等于取得了依赖列表,剩下的工作就是将依赖当做参数传入。

params = [];
for(var i=0,l=paramNames.length;i<l;i++){
    params.push(_cached[paramNames[i]]);
}

3、传递依赖项参数并实例化

func.apply(bind,params);

完整代码:

var Injector = function(){
        this._cache = {};
}
Injector.prototype.getParamNames = function(func){
        var paramNames = func.toString().match(/function\s+[^\(]*\(([^\)]*)\)/m)[1];
        paramNames = paramNames.replace(/\s*/,"");
        paramNames = paramNames.split(",");
        return paramNames;
}
Injector.prototype.put = function(name,obj){
        this._cache[name] = obj;
}
Injector.prototype.resolve = function(func,bind){
        var paramNames = this.getParamNames(func),params = [];
        for(var i=0,l=paramNames.length;i<l;i++){
                params.push(this._cache[paramNames[i]]);
        }
        func.apply(bind,params);
}

在线实例:http://demo.deanhan.cn/injector/

  • 支付宝二维码 支付宝
  • 微信二维码 微信
相关文章