博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JavaScript实现依赖注入
阅读量:5292 次
发布时间:2019-06-14

本文共 1301 字,大约阅读时间需要 4 分钟。

var cache = {};

// 通过解析Function.prototype.toString()取得参数名
function 
getParamNames(func) {
    
// 正则表达式出自http://krasimirtsonev.com/blog/article/Dependency-injection-in-JavaScript
    
var 
paramNames = func.toString().match(/^
function
\s*[^\(]*\(\s*([^\)]*)\)/m)[1];
    
paramNames = paramNames.replace(/ /g, 
''
);
    
paramNames = paramNames.split(
','
);
    
return 
paramNames;
}
var 
injector = {
    
// 将func作用域中的this关键字绑定到bind对象上,bind对象可以为空
    
resolve: 
function 
(func, bind) {
        
// 取得参数名
        
var 
paramNames = getParamNames(func);
        
var 
params = [];
        
for 
(
var 
i = 0; i < paramNames.length; i++) {
            
// 通过参数名在cache中取出相应的依赖
            
params.push(cache[paramNames[i]]);
        
}
        
// 注入依赖并执行函数
        
func.apply(bind, params);
    
}
};
  
function 
Notebook() {}
Notebook.prototype.printName = 
function 
() {
    
console.log(
'this is a notebook'
);
};
  
function 
Pencil() {}
Pencil.prototype.printName = 
function 
() {
    
console.log(
'this is a pencil'
);
};
  
function 
Student() {}
Student.prototype.write = 
function 
(notebook, pencil) {
    
if 
(!notebook || !pencil) {
        
throw 
new 
Error(
'Dependencies not provided!'
);
    
}
    
console.log(
'writing...'
);
};
// 提供notebook依赖
cache[
'notebook'
] = 
new 
Notebook();
// 提供pencil依赖
cache[
'pencil'
] = 
new 
Pencil();
var 
student = 
new 
Student();
injector.resolve(student.write, student); 
// writing...

转载于:https://www.cnblogs.com/Bideam/p/7156500.html

你可能感兴趣的文章
DLNA介绍(包含UPnP,2011/6/20 更新)
查看>>
ANGULARJS5从0开始(2) - 整合bootstrap和font-awesome
查看>>
Android 使用Parcelable序列化对象
查看>>
Python Web框架Django (零)
查看>>
Foxmail出现 错误信息:553 mailbox not found怎么解决
查看>>
spring_远程调用
查看>>
js 中基本数据类型和引用数据类型 ,,,, js中对象和函数的关系
查看>>
登录服务器,首先用到的5个命令
查看>>
多米诺骨牌
查看>>
区间DP 等腰三角形
查看>>
mysql 存储引擎对索引的支持
查看>>
Linq 学习(1) Group & Join--网摘
查看>>
asp.net 调用前台JS调用后台,后台掉前台JS
查看>>
【转】iOS 宏(define)与常量(const)的正确使用-- 不错
查看>>
【转】iOS开发UI篇—iPad和iPhone开发的比较
查看>>
【转】Android底层库和程序
查看>>
Comparación para 2019 Nueva Lonsdor K518S y K518ISE
查看>>
论文笔记——MobileNets(Efficient Convolutional Neural Networks for Mobile Vision Applications)
查看>>
从今天开始
查看>>
Attribute(特性)与AOP
查看>>