热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

JavaScript趣题:依赖注入

你想必听说过依赖注入(DI)模式吧?无论是后端火的一塌糊涂的spring框架,还是前端潮流angular.js,处处可见依赖注入的身影。
你想必听说过依赖注入(DI)模式吧?

无论是后端火的一塌糊涂的Spring框架,还是前端潮流angular.js,处处可见依赖注入的身影。

它这个名词有些晦涩,但核心的思想却很简单。

用一句俗话说就是,“要风得风,要雨得雨”,或者说是“饭来张口,衣来伸手”

你听了我这么一解释,大概还有些迷糊,我就先上一个例子。

下面是一些模块,他们也被称为“依赖”,被存储在一个hash对象中:


var deps = {
  'firstDependency': function () {return 'this is firstDependency';},
  'secondDepency': function () {return 'this is secondDepency';},
};

下面则是一个依赖注入的管理器,到时候是要new出来的:


var DI = function (dependency) {
  this.dependency = dependency;
};

new的时候,就把deps当参数传进去了。

好,现在问题的关键来了,我们要编写的东西:


DI.prototype.inject = function (func) {......};

这个inject注入方法绑定在DI的原型上,接收一个函数作为参数。

那它该怎么使用呢?


	var di = new DI(deps);

	var myDependentFunc = di.inject(function (secondDepency, firstDependency) {
	    firstDependency();
	    secondDepency();
	});

	myDependentFunc();


大家先观察一下这个inject传入的匿名函数,它代表需求,是我们需要注入的地方。

先看看它的形参,

secondDepency, firstDependency

这里有两个参数,即代表两个需求,到时候,我们要分析这两个参数,查找相关模块。

好,回到inject函数的编写问题上来,第一步该怎么做?

先获取inject传进来函数的toString()形式:


	
	//第一步
	DI.prototype.inject = function (func) {
		func.toString();
	};


接着,分析这个字符串,找出所有的形参:


	
	//第二步
	DI.prototype.inject = function (func) {
		var args = findArgs(func.toString());
	};

findArgs方法该怎么编写?使用正则或者字符串分割截取都可以,这里我用的后者。


String.prototype.trim=function(){
  return this.replace(/(^\s*)|(\s*$)/g, "");
};

var findArgs = function(funcStr){
    var bracket1 = funcStr.indexOf("(");
    var bracket2 = funcStr.indexOf(")");
    var argsStr = funcStr.slice(bracket1+1,bracket2);
    var args = argsStr.split(",");
    return args.map(function(e){
        return e.trim();
    });
};

找出所有的形参后,第三步,从模块hash表中,找出对应的模块函数,存放进实参列表中。

realArgs指代实参列表


	
	//第三步
	DI.prototype.inject = function (func) {
		var args = findArgs(func.toString());
		var realArgs = [];
		for(var i=0;i


最后一步才是注入,inject返回一个匿名函数,匿名函数执行的时候,通过闭包,获取实参列表,注入到func中。


DI.prototype.inject = function (func) {
    var args = findArgs(func.toString());
    var realArgs = [];
    for(var i=0;i

这样,一个简单版的注入函数就完工了。
以上就是Javascript趣题:依赖注入的内容,更多相关内容请关注PHP中文网(www.php1.cn)!

推荐阅读
  • 这篇文章主要简要记录了对于研发团队工作的质量 ... [详细]
  • linux json 写sql注入,sql注入之json注入(php代码)
    环境phpstudyphp服务端代码security数据库中的users表中的username,password字段用户名adminJSON服务端代码大家实际测试中注 ... [详细]
  • 延迟注入工具(python)的SQL脚本
    本文介绍了一个延迟注入工具(python)的SQL脚本,包括使用urllib2、time、socket、threading、requests等模块实现延迟注入的方法。该工具可以通过构造特定的URL来进行注入测试,并通过延迟时间来判断注入是否成功。 ... [详细]
  • 本文介绍了一个免费的asp.net控件,该控件具备数据显示、录入、更新、删除等功能。它比datagrid更易用、更实用,同时具备多种功能,例如属性设置、数据排序、字段类型格式化显示、密码字段支持、图像字段上传和生成缩略图等。此外,它还提供了数据验证、日期选择器、数字选择器等功能,以及防止注入攻击、非本页提交和自动分页技术等安全性和性能优化功能。最后,该控件还支持字段值合计和数据导出功能。总之,该控件功能强大且免费,适用于asp.net开发。 ... [详细]
  • 背景应用安全领域,各类攻击长久以来都危害着互联网上的应用,在web应用安全风险中,各类注入、跨站等攻击仍然占据着较前的位置。WAF(Web应用防火墙)正是为防御和阻断这类攻击而存在 ... [详细]
  • 本文介绍了互联网思维中的三个段子,涵盖了餐饮行业、淘品牌和创业企业的案例。通过这些案例,探讨了互联网思维的九大分类和十九条法则。其中包括雕爷牛腩餐厅的成功经验,三只松鼠淘品牌的包装策略以及一家创业企业的销售额增长情况。这些案例展示了互联网思维在不同领域的应用和成功之道。 ... [详细]
  • 安全3AAuthentication:认证Authorzation:授权Accouting|Audition:审计用户管理用户:UID:0,不一定是root,root的uid非0时 ... [详细]
  • 吴恩达“机器学习”——学习笔记二
    定义一些名词欠拟合(underfitting):数据中的某些成分未被捕获到,比如拟合结果是二次函数,结果才只拟合出了一次函数。过拟合(overfitting):使用过量的特征集合, ... [详细]
  • Eclipse中SpringBoot响应jsp的简单demo
    首先在Eclipse里新建一个maven工程,这里的打包类型和父包如果后续再去pom中添加也可以此时的工程路径是这样的接下来去到pom中添加相关的依赖,如果有报错mavenupda ... [详细]
  • MariaDB 10 Slave Crash-Safe需转为GTID复制模式
    之前写了一篇《MySQL5.6crash-safereplication》,但在Mariadb10.0.X和10.1.X上不支持relay_log_info_repository ... [详细]
  • 前言微服务架构(MicroserviceArchitecture)是一种架构概念,旨在通过将功能分解到各个离散的服务中以实现对解决方案的解耦。你可以将其看作是在架构层次而非获取服务 ... [详细]
  • 变限积分的求导公式及其应用周少波;雷冬霞;程生敏【期刊名称】《学园》【年(卷),期】2012(000)019【摘要】本文针对学生难以掌握的变限定积分的最为一般的求导公式࿰ ... [详细]
  • ARToolKitunity
    ARToolKit为开源的AR库,相对于高通和easyAr有几点特点:1)开源2)识别项目可以动态添加(详细在后)3)识别文件可以本地生成4)目前只能识别图片(目前为.jpg格式) ... [详细]
  • 接上文http:blog.itpub.net29254281viewspace-1318239领导让开发同学鼓捣一个可配置化的后台.又回到了原来的问题如果要灵活,很多参数要 ... [详细]
  • Iwouldliketobeabletohaveasidebarthatcanbetoggledinandoutonabuttonpress.However ... [详细]
author-avatar
丹丹2502912601
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有