JavaScript中实现依赖注入的思路分享


Posted in Javascript onJanuary 15, 2015

如今各个框架都在模块化,连前端的javascript也不例外。每个模块负责一定的功能,模块与模块之间又有相互依赖,那么问题来了:javascript的依赖注入如何实现?(javascript的依赖注入,各大框架都有相应的实现,这里只学习实现思路)

如下需求:

假设已经有定义好的服务模块Key-Value集合,func为添加的新服务,参数列表为服务依赖项。

var services = { abc : 123, def : 456, ghi : 789 }; // 假设已定义好某些Service

function Service(abc, ghi){

    this.write = function(){

        console.log(abc);

        console.log(ghi);

    }

}

function Activitor(func){

    var obj;

    // 实现

    return obj;

}

解决思路:

通过某种机制(反射?),取出该func定义的参数列表,并一一赋值。然后再通过某种机制(Activitor?),实例化该func。

解决方案:

一、获取func的参数列表:

如何获取参数列表呢?我首先想到的是反射机制。那javascript里面有没有反射呢?应该有吧,我目前只知道使用eval(str)函数,但貌似并没有获取参数列表的相关实现。再看func.arguments定义,此属性只在调用func并传递参数时才有效,也不能满足需求。

那能不能通过处理func.toString()后的字符串获取参数列表呢?

上手试试吧:

 function getFuncParams(func) {

     var matches = func.toString().match(/^function\s*[^\(]*\(\s*([^\)]*)\)/m);

     if (matches && matches.length > 1)

         return matches[1].replace(/\s*/, '').split(','); 

     return [];

 };

至此获得func参数列表数组。

二、根据参数列表寻找依赖:

得到了参数列表,即得到了依赖列表,将依赖项作为参数传入也就很简单了。

 var params = getFuncParams(func);

 for (var i in params) {

     params[i] = services[params[i]];

 }

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

我们知道,javascript里面有func.constructor有call(thisArg,[arg[,arg,[arg,[…]]]])和apply(thisArg,args…)两个函数,都可以实现实例化func操作。其中call函数第一个参数为this指针,剩余为参数列表,这个适合在已知func参数列表的情况下使用,不能满足我的需求。再看第二个apply函数,第一个参数也为this指针,第二个参数为参数数组,其在调用时会自动为func的参数列表一一赋值,正好满足我的需求。

代码大概如下:

function Activitor(func){

    var obj = {};

    func.apply(obj, params);

    return obj;

}

至此我们能够创建该func的实例,并传递该func需要的参数。

四、打印测试一下吧:

完整代码:

var

    // 假设已定义好某些Service

    services = { abc: 123, def: 456, ghi: 789 },
    // 获取func的参数列表(依赖列表)

    getFuncParams = function (func) {

        var matches = func.toString().match(/^function\s*[^\(]*\(\s*([^\)]*)\)/m);

        if (matches && matches.length > 1)

            return matches[1].replace(/\s+/, '').split(',');

        return [];

    },
    // 根据参数列表(依赖列表)填充参数(依赖项)

    setFuncParams = function (params) {

        for (var i in params) {

            params[i] = services[params[i]];

        }

        return params;

    };
// 激活器

function Activitor(func) {

    var obj = {};

    func.apply(obj, setFuncParams(getFuncParams(func)));

    return obj;

}
// 定义新Service

function Service(abc, ghi) {

    this.write = function () {

        console.log(abc);

        console.log(ghi);

    }

}
// 实例化Service并调用方法

var service = Activitor(Service);

service.write();

控制台成功打印!
Javascript 相关文章推荐
JavaScript 字符串连接性能优化
Dec 20 Javascript
精心挑选的15个jQuery下拉菜单制作教程
Jun 15 Javascript
JavaScript 垃圾回收机制分析
Oct 10 Javascript
node.js中的fs.lchownSync方法使用说明
Dec 16 Javascript
js实现从右向左缓缓浮出网页浮动层广告的方法
May 09 Javascript
Web前端新人笔记之jquery入门心得(新手必看)
May 17 Javascript
全面理解闭包机制
Jul 11 Javascript
详解基于 axios 的 Vue 项目 http 请求优化
Sep 04 Javascript
Vue入门之数量加减运算操作示例
Dec 11 Javascript
JavaScript命名空间模式实例详解
Jun 20 Javascript
jQuery层叠选择器用法实例分析
Jun 28 jQuery
在react中使用vue的状态管理的方法示例
May 02 Javascript
jquery实现textarea输入框限制字数的方法
Jan 15 #Javascript
28个常用JavaScript方法集锦
Jan 14 #Javascript
jquery单选框radio绑定click事件实现方法
Jan 14 #Javascript
jquery移动节点实例
Jan 14 #Javascript
jquery获取checkbox的值并post提交
Jan 14 #Javascript
js打造数组转json函数
Jan 14 #Javascript
使用jquery 简单实现下拉菜单
Jan 14 #Javascript
You might like
php中fgetcsv()函数用法实例
2014/11/28 PHP
PHP+JS三级菜单联动菜单实现方法
2016/02/24 PHP
PHP实现生成模糊图片的方法示例
2017/12/21 PHP
PHP中localeconv()函数的用法
2019/03/26 PHP
一个很酷的拖动层的js类,兼容IE及Firefox
2009/06/23 Javascript
一个挺有意思的Javascript小问题说明
2011/09/26 Javascript
JQUERY1.6 使用方法四 检测浏览器
2011/11/23 Javascript
Javascript中的匿名函数与封装介绍
2015/03/15 Javascript
jQuery图片左右滚动代码 有左右按钮实例
2016/06/20 Javascript
jQuery EasyUI封装简化操作
2016/09/18 Javascript
jQuery css() 方法动态修改CSS属性
2016/09/25 Javascript
简单三步实现报表页面集成天气
2016/12/15 Javascript
深入浅析javascript函数中with
2018/10/28 Javascript
实例讲解JavaScript截取字符串
2018/11/30 Javascript
nodejs分离html文件里面的js和css的方法
2019/04/09 NodeJs
详解基于原生JS验证表单组件xy-form
2019/08/20 Javascript
JS获取当前时间戳方法解析
2020/08/29 Javascript
JavaScript实现瀑布流布局的3种方式
2020/12/27 Javascript
[14:21]VICI vs EG (BO3)
2018/06/07 DOTA
使用Python脚本将文字转换为图片的实例分享
2015/08/29 Python
Python cookbook(数据结构与算法)让字典保持有序的方法
2018/02/18 Python
python图书管理系统
2020/04/05 Python
python模拟表单提交登录图书馆
2018/04/27 Python
python pygame实现2048游戏
2018/11/20 Python
Django 源码WSGI剖析过程详解
2019/08/05 Python
Django框架静态文件处理、中间件、上传文件操作实例详解
2020/02/29 Python
Python多个装饰器的调用顺序实例解析
2020/05/22 Python
Python实现京东抢秒杀功能
2021/01/25 Python
Python实现曲线拟合的最小二乘法
2021/02/19 Python
法人任命书范本
2014/06/04 职场文书
物流业务员岗位职责
2015/04/03 职场文书
惊天动地观后感
2015/06/10 职场文书
搞笑婚礼主持词开场白
2015/11/24 职场文书
八年级作文之我的母亲
2019/12/10 职场文书
详解Redis瘦身指南
2021/05/26 Redis
解决xampp安装后Apache无法启动
2022/03/21 Servers