成人免费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語言框架

2024-12-30 12:00:00

.NET Core依賴注入屬性注入

2022-04-11 09:02:18

Swift依賴注

2014-07-08 14:05:48

DaggerAndroid依賴

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技術棧公眾號

主站蜘蛛池模板: 国产精品国产a | 久草视频在线播放 | 狠狠狠色丁香婷婷综合久久五月 | 久久乐国产精品 | 亚洲高清在线观看 | 国产精品我不卡 | 久久久久久久国产 | 欧美成人一区二区三区 | 国产精品久久久久久久久大全 | 日韩精品二区 | 国产ts人妖一区二区三区 | 亚洲精品乱码 | 久久综合入口 | 中文字幕亚洲区一区二 | 国产精品免费观看 | 狠狠操狠狠 | 久久av在线播放 | 免费看一区二区三区 | 七七婷婷婷婷精品国产 | 男人天堂网址 | 精品国产一级 | 日本在线观看视频 | 国产精品久久久久久亚洲调教 | 国产精选一区 | 黄色成人av | 欧美a免费 | 欧美一区二区三区 | 亚洲精品91| 成人免费区一区二区三区 | 欧美精品成人一区二区三区四区 | 欧美福利视频 | 在线日韩中文字幕 | 久久综合九色综合欧美狠狠 | 完全免费在线视频 | 欧美一区二区在线观看 | 午夜久久久久 | 狠狠草视频 | 欧美一区二区三区免费在线观看 | www.日本三级 | 97精品国产 | 欧美www在线观看 |