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 相关文章推荐
jQuery Mobile页面跳转后未加载外部JS原因分析及解决
Mar 18 Javascript
JQuery实现可直接编辑的表格
Apr 16 Javascript
javascript实现uploadify上传格式以及个数限制
Nov 23 Javascript
基于jquery实现简单的手风琴特效
Nov 24 Javascript
AngularJS 指令详细介绍
Jul 27 Javascript
微信小程序实战之顶部导航栏(选项卡)(1)
Jun 19 Javascript
JavaScript 通过Ajax 动态加载CheckBox复选框
Aug 31 Javascript
AngularJS 教程及实例代码
Oct 23 Javascript
elementui的默认样式修改方法
Feb 23 Javascript
js原生map实现的方法总结
Jan 19 Javascript
JavaScript如何判断input数据类型
Feb 06 Javascript
JS中类的静态方法,静态变量,实例方法,实例变量区别与用法实例分析
Mar 14 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
玩转图像函数库―常见图形操作
2006/09/03 PHP
smarty模板嵌套之include与fetch性能测试
2010/12/05 PHP
PHP中你应该知道的require()文件包含的正确用法
2015/06/12 PHP
利用Homestead快速运行一个Laravel项目的方法详解
2017/11/14 PHP
PHP实现git部署的方法教程
2017/12/19 PHP
PHP代码覆盖率统计详解
2020/07/22 PHP
一些常用的JS功能函数(2009-06-04更新)
2009/06/04 Javascript
js图片自动切换效果处理代码
2013/05/07 Javascript
判断文件是否正在被使用的JS代码
2013/12/21 Javascript
Javascript判断图片尺寸大小实例分析
2014/06/16 Javascript
Javascript实现获取及设置光标位置的方法
2015/07/21 Javascript
javascript中if和switch,==和===详解
2015/07/30 Javascript
jQuery实现鼠标跟随提示层效果代码(可显示文本,Div,Table,Html等)
2016/04/18 Javascript
JavaScript Ajax实现异步通信
2016/12/14 Javascript
JS库之ParticlesJS使用简介
2017/09/12 Javascript
js经验分享 JavaScript反调试技巧
2018/03/10 Javascript
浅谈Vue路由快照实现思路及其问题
2018/06/07 Javascript
JS加密插件CryptoJS实现的Base64加密示例
2020/08/16 Javascript
学习LayUI时自研的表单参数校验框架案例分析
2019/07/29 Javascript
微信小程序自定义组件components(代码详解)
2019/10/21 Javascript
vue.js实现简单购物车功能
2020/05/30 Javascript
Python中列表(list)操作方法汇总
2014/08/18 Python
python实现通过shelve修改对象实例
2014/09/26 Python
理解Python中的类与实例
2015/04/27 Python
python实现爬取图书封面
2018/07/05 Python
Django Rest framework解析器和渲染器详解
2019/07/25 Python
基于python的BP神经网络及异或实现过程解析
2019/09/30 Python
Python3.7+tkinter实现查询界面功能
2019/12/24 Python
一款纯css3实现的响应式导航
2014/10/31 HTML / CSS
英国在线玫瑰专家:InterRose
2019/12/01 全球购物
char型变量中能不能存贮一个中文汉字
2015/07/08 面试题
2014年入党积极分子党课学习心得体会模板
2014/04/03 职场文书
超市七夕促销活动方案
2014/08/28 职场文书
护士节活动总结
2014/08/29 职场文书
党员个人对照检查材料思想汇报
2014/09/16 职场文书
Ruby序列化和持久化存储 Marshal和Pstore介绍
2022/04/18 Ruby