成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

JavaScript依賴注入的實現思路

開發 前端
如今各個框架都在模塊化,連前端的javascript也不例外。每個模塊負責一定的功能,模塊與模塊之間又有相互依賴,那么問題來了:javascript的依賴注入如何實現?(javascript的依賴注入,各大框架都有相應的實現,這里只學習實現思路)

如今各個框架都在模塊化,連前端的javascript也不例外。每個模塊負責一定的功能,模塊與模塊之間又有相互依賴,那么問題來了:javascript的依賴注入如何實現?(javascript的依賴注入,各大框架都有相應的實現,這里只學習實現思路)

[[147762]]

如下需求:

假設已經有定義好的服務模塊Key-Value集合,func為添加的新服務,參數列表為服務依賴項。

  1. var services = { abc : 123, def : 456, ghi : 789 }; // 假設已定義好某些Service 
  2. function Service(abc, ghi){ 
  3.     this.write = function(){ 
  4.         console.log(abc); 
  5.         console.log(ghi); 
  6.     } 
  7. function Activitor(func){ 
  8.     var obj; 
  9.     // 實現 
  10.     return obj; 

解決思路:

通過某種機制(反射?),取出該func定義的參數列表,并一一賦值。然后再通過某種機制(Activitor?),實例化該func。

解決方案:

一、獲取func的參數列表:

如何獲取參數列表呢?我首先想到的是反射機制。那javascript里面有沒有反射呢?應該有吧,我目前只知道使用eval(str)函數,但貌 似并沒有獲取參數列表的相關實現。再看func.arguments定義,此屬性只在調用func并傳遞參數時才有效,也不能滿足需求。

那能不能通過處理func.toString()后的字符串獲取參數列表呢?

上手試試吧:

  1. function getFuncParams(func) { 
  2.      var matches = func.toString().match(/^function\s*[^\(]*\(\s*([^\)]*)\)/m); 
  3.      if (matches && matches.length > 1
  4.          return matches[1].replace(/\s*/, '').split(','); 
  5.      return []; 
  6. }; 

至此獲得func參數列表數組。

二、根據參數列表尋找依賴:

得到了參數列表,即得到了依賴列表,將依賴項作為參數傳入也就很簡單了。

  1. var params = getFuncParams(func); 
  2. or (var i in params) { 
  3.     params[i] = services[params[i]]; 

三、傳遞依賴項參數并實例化:

我們知道,javascript里面有func.constructor有call(thisArg,[arg[,arg,[arg, […]]]])和apply(thisArg,args…)兩個函數,都可以實現實例化func操作。其中call函數***個參數為this指針,剩余為 參數列表,這個適合在已知func參數列表的情況下使用,不能滿足我的需求。再看第二個apply函數,***個參數也為this指針,第二個參數為參數數 組,其在調用時會自動為func的參數列表一一賦值,正好滿足我的需求。

代碼大概如下:

  1. function Activitor(func){ 
  2.     var obj = {}; 
  3.     func.apply(obj, params); 
  4.     return obj; 

至此我們能夠創建該func的實例,并傳遞該func需要的參數。

四、打印測試一下吧:

完整代碼:

 

  1. var 
  2.     // 假設已定義好某些Service 
  3.     services = { abc: 123, def: 456, ghi: 789 }, 
  4.  
  5.     // 獲取func的參數列表(依賴列表) 
  6.     getFuncParams = function (func) { 
  7.         var matches = func.toString().match(/^function\s*[^\(]*\(\s*([^\)]*)\)/m); 
  8.         if (matches && matches.length > 1
  9.             return matches[1].replace(/\s+/, '').split(','); 
  10.         return []; 
  11.     }, 
  12.  
  13.     // 根據參數列表(依賴列表)填充參數(依賴項) 
  14.     setFuncParams = function (params) { 
  15.         for (var i in params) { 
  16.             params[i] = services[params[i]]; 
  17.         } 
  18.         return params; 
  19.     }; 
  20.  
  21. // 激活器 
  22. function Activitor(func) { 
  23.     var obj = {}; 
  24.     func.apply(obj, setFuncParams(getFuncParams(func))); 
  25.     return obj; 
  26.  
  27. // 定義新Service 
  28. function Service(abc, ghi) { 
  29.     this.write = function () { 
  30.         console.log(abc); 
  31.         console.log(ghi); 
  32.     } 
  33.  
  34. // 實例化Service并調用方法 
  35. var service = Activitor(Service); 
  36. service.write(); 

控制臺成功打??!

責任編輯:王雪燕 來源: Keithen.Leo
相關推薦

2022-12-29 08:54:53

依賴注入JavaScript

2017-08-16 16:00:05

PHPcontainer依賴注入

2018-03-12 10:02:30

PHP依賴注入

2011-03-01 13:45:41

Spring3Annotation

2025-02-17 00:00:55

NET開發依賴注入

2011-05-31 10:00:21

Android Spring 依賴注入

2010-10-25 12:10:39

SQL注入

2023-07-11 09:14:12

Beanquarkus

2024-05-27 00:13:27

Go語言框架

2022-04-11 09:02:18

Swift依賴注

2014-07-08 14:05:48

DaggerAndroid依賴

2024-12-30 12:00:00

.NET Core依賴注入屬性注入

2017-07-26 17:10:24

前端JavascriptThis

2016-10-20 19:36:01

androiddagger2依賴注入

2013-12-02 09:35:10

2017-03-01 14:28:25

2021-07-25 21:13:50

框架Angular開發

2016-03-21 17:08:54

Java Spring注解區別

2016-12-28 09:30:37

Andriod安卓平臺依賴注入

2019-05-29 17:45:32

JavaScript算法思路代碼實現
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲视频免费在线 | 精品一区二区三区四区五区 | 久色视频在线观看 | 在线中文字幕av | 在线只有精品 | 羞羞视频免费观看入口 | 国产在线视频一区二区 | 午夜国产羞羞视频免费网站 | 91成人免费看片 | 欧美日韩精品一区二区三区视频 | 天天干天天玩天天操 | 99re在线观看 | 精品久久久久久亚洲精品 | 久久激情网 | 欧美精品在线一区 | 国产一级在线视频 | 一区二区三区四区免费观看 | 国产高清视频一区二区 | 日韩中文久久 | 亚洲精品久久久久久下一站 | 婷婷色成人 | www.久久精品 | 精品国产一区二区国模嫣然 | 国产精品99久久免费观看 | www.日日干 | 中文字幕在线观看 | 久久精品亚洲 | 超碰美女在线 | 久久久久国产一区二区三区四区 | 欧美不卡视频一区发布 | 天堂在线91 | 国产专区在线 | 91在线精品视频 | 一级片在线观看 | 国产伦精品一区二区三区照片91 | 久久网站免费视频 | 亚洲精品久久久久中文字幕二区 | 91网视频 | 老外黄色一级片 | 69堂永久69tangcom | 国产精品自拍视频网站 |