偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

JavaScript依賴注入的實現(xiàn)思路

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

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

[[147762]]

如下需求:

假設(shè)已經(jīng)有定義好的服務(wù)模塊Key-Value集合,func為添加的新服務(wù),參數(shù)列表為服務(wù)依賴項。

  1. var services = { abc : 123, def : 456, ghi : 789 }; // 假設(shè)已定義好某些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.     // 實現(xiàn) 
  10.     return obj; 

解決思路:

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

解決方案:

一、獲取func的參數(shù)列表:

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

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

上手試試吧:

  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參數(shù)列表數(shù)組。

二、根據(jù)參數(shù)列表尋找依賴:

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

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

三、傳遞依賴項參數(shù)并實例化:

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

代碼大概如下:

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

至此我們能夠創(chuàng)建該func的實例,并傳遞該func需要的參數(shù)。

四、打印測試一下吧:

完整代碼:

 

  1. var 
  2.     // 假設(shè)已定義好某些Service 
  3.     services = { abc: 123, def: 456, ghi: 789 }, 
  4.  
  5.     // 獲取func的參數(shù)列表(依賴列表) 
  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.     // 根據(jù)參數(shù)列表(依賴列表)填充參數(shù)(依賴項) 
  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并調(diào)用方法 
  35. var service = Activitor(Service); 
  36. service.write(); 

控制臺成功打??!

責(zé)任編輯:王雪燕 來源: Keithen.Leo
相關(guān)推薦

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開發(fā)依賴注入

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開發(fā)

2016-03-21 17:08:54

Java Spring注解區(qū)別

2016-12-28 09:30:37

Andriod安卓平臺依賴注入

2019-05-29 17:45:32

JavaScript算法思路代碼實現(xiàn)
點贊
收藏

51CTO技術(shù)棧公眾號