在Javascript中实现依赖注入的共享思想
现在每个模块都是模块化的,前端的Javascript也不例外,每个模块负责某个功能,模块与模块之间是相互依赖的。那么问题是:Javascript的依赖注入是如何实现的(javascript的依赖注入,主要框架有相应的实现,这里只学习实现这个想法)下列要求如下:
假设已经定义了服务模块键值集合,函数是一个新的服务,而参数列表是一个服务依赖项。
复制代码代码如下所示:
无功服务= { ABC:123、定义:456、酥油:789 }; / /假设已在一些服务定义
功能服务(ABC,GHI){
this.write =函数(){
console.log(ABC);
console.log(GHI);
}
}
功能激活剂(功能){
var obj;
实现
返回对象;
}
解决这个想法:
通过某种机制(反射)取出的函数定义的参数列表,它指定一个接一个。然后通过某种机制(激活)函数被实例化。
Solution:
首先,获取函数的参数列表:
如何获得参数列表我首先想到的是反射机制。Javascript中有反射吗这是应该的,我只知道使用eval(STR)的功能,但它似乎没有得到参数列表的相关实现。看func.arguments定义,它只有在调用函数传递参数,并不能满足要求。
Can that get the list of parameters by processing the string after func.toString ()
试试看:
复制代码代码如下所示:
功能getfuncparams(功能){
VaR(= func.tostring比赛。比赛( / ^功能 * { ^ )(} * ( *({ ^ )}×), / m));
如果(比赛matches.length > 1)
返回匹配{ 1 }替换。(Split);
返回{ };
};
此时,将获得函数参数列表数组。
两。根据参数列表查找依赖项:
获得一个参数列表,即获得一个依赖列表,并且很容易将依赖项作为参数传递。
复制代码代码如下所示:
var参数= getfuncparams(功能);
(我在对VaR参数){
参数{我} = { } } {我服务参数;
}
三。传递依赖项参数并实例化:
我们知道有Javascript的呼叫func.constructor(thisarg,{ { {精氨酸,精氨酸,精氨酸,{…}为(thisarg,args)和应用…)两种功能都能实现的功能操作的实例,调用函数的第一个参数是指针,和其余的参数列表。这是适用于已知函数参数列表的情况下使用的。它不能满足我的需要。第一个参数是这个指针。第二个参数是参数数组。当它被调用时,它自动将一个参数列表分配给函数,它刚好满足我的需要。
代码可能如下所示:
复制代码代码如下所示:
功能激活剂(功能){
var obj = { };
Func.apply(obj参数);
返回对象;
}
在这一点上,我们可以创建函数的实例并传递函数所需的参数。
四。打印并测试它。
完整的代码:
复制代码代码如下所示:
VaR
已经定义了一些假设。
服务= { { ABC:123、定义:456、酥油:789 },
获取函数列表(在列表中)
getfuncparams =函数(函数){
VaR(= func.tostring比赛。比赛( / ^功能 * { ^ )(} * ( *({ ^ )}×), / m));
如果(比赛matches.length > 1)
返回匹配{ 1 }。替换。(Split);
返回{ };
},
根据参数列表(列表/依赖)填充参数(依赖)
setfuncparams =函数(参数){
(我在对VaR参数){
参数{我} = { } } {我服务参数;
}
返回参数;
};
激活器
功能激活剂(功能){
var obj = { };
Func.apply(obj,setfuncparams(getfuncparams(功能)));
返回对象;
}
定义新服务
功能服务(ABC,GHI){
this.write =函数(){
console.log(ABC);
console.log(GHI);
}
}
实例化服务和方法
无功服务=激活(服务);
service.write();
控制台已成功打印!