自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

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

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

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

[[147762]]

如下需求:

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

  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.     // 實(shí)現(xiàn) 
  10.     return obj; 

解決思路:

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

解決方案:

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

如何獲取參數(shù)列表呢?我首先想到的是反射機(jī)制。那javascript里面有沒有反射呢?應(yīng)該有吧,我目前只知道使用eval(str)函數(shù),但貌 似并沒有獲取參數(shù)列表的相關(guān)實(shí)現(xiàn)。再看func.arguments定義,此屬性只在調(diào)用func并傳遞參數(shù)時(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ù)列表,即得到了依賴列表,將依賴項(xiàng)作為參數(shù)傳入也就很簡(jiǎn)單了。

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

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

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

代碼大概如下:

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

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

四、打印測(cè)試一下吧:

完整代碼:

 

  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ù)(依賴項(xiàng)) 
  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. // 實(shí)例化Service并調(diào)用方法 
  35. var service = Activitor(Service); 
  36. service.write(); 

控制臺(tái)成功打?。?/p>

責(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 依賴注入

2023-07-11 09:14:12

Beanquarkus

2010-10-25 12:10:39

SQL注入

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依賴注入

2016-03-21 17:08:54

Java Spring注解區(qū)別

2016-12-28 09:30:37

Andriod安卓平臺(tái)依賴注入

2021-07-25 21:13:50

框架Angular開發(fā)

2017-03-01 14:28:25

2019-05-29 17:45:32

JavaScript算法思路代碼實(shí)現(xiàn)

2013-12-02 09:35:10

點(diǎn)贊
收藏

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