亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 語言 > JavaScript > 正文

JavaScript中實現依賴注入的思路分享

2024-05-06 16:14:30
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了JavaScript中實現依賴注入的思路分享,本文給出的解決方案包括獲取func的參數列表、根據參數列表尋找依賴、傳遞依賴項參數并實例化等3個步驟,需要的朋友可以參考下
 

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

如下需求:

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

復制代碼代碼如下:

var services = { abc : 123, def : 456, ghi : 789 }; // 假設已定義好某些Service
function Service(abc, ghi){
    this.write = function(){
        console.log(abc);
        console.log(ghi);
    }
}
function Activitor(func){
    var obj;
    // 實現
    return obj;
}

解決思路:

 

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

解決方案:

一、獲取func的參數列表:

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

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

上手試試吧:

復制代碼代碼如下:

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

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

 

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

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

復制代碼代碼如下:

 var params = getFuncParams(func);
 for (var i in params) {
     params[i] = services[params[i]];
 }

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

 

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

代碼大概如下:

復制代碼代碼如下:

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

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

 

四、打印測試一下吧:

完整代碼:

復制代碼代碼如下:

var
    // 假設已定義好某些Service
    services = { abc: 123, def: 456, ghi: 789 },

 

    // 獲取func的參數列表(依賴列表)
    getFuncParams = function (func) {
        var matches = func.toString().match(/^function/s*[^/(]*/(/s*([^/)]*)/)/m);
        if (matches && matches.length > 1)
            return matches[1].replace(//s+/, '').split(',');
        return [];
    },

    // 根據參數列表(依賴列表)填充參數(依賴項)
    setFuncParams = function (params) {
        for (var i in params) {
            params[i] = services[params[i]];
        }
        return params;
    };

// 激活器
function Activitor(func) {
    var obj = {};
    func.apply(obj, setFuncParams(getFuncParams(func)));
    return obj;
}

// 定義新Service
function Service(abc, ghi) {
    this.write = function () {
        console.log(abc);
        console.log(ghi);
    }
}

// 實例化Service并調用方法
var service = Activitor(Service);
service.write();


控制臺成功打??!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美色视频日本版| 亚洲石原莉奈一区二区在线观看| 91亚洲精品久久久久久久久久久久| 中文字幕亚洲无线码在线一区| 国产精品久久一区| 亚洲成人黄色网| 91精品国产色综合久久不卡98| 国产精品男人的天堂| 超在线视频97| 精品久久国产精品| 97超碰国产精品女人人人爽| 最近2019中文免费高清视频观看www99| 午夜免费在线观看精品视频| 国内精品400部情侣激情| 怡红院精品视频| 精品国产依人香蕉在线精品| 日韩网站免费观看高清| 亚洲精品国产suv| 日韩欧美亚洲一二三区| 亚洲人成电影网站色| 日韩在线视频导航| 日韩免费电影在线观看| 亚洲美女av电影| 91亚洲精华国产精华| 2019中文字幕在线免费观看| 亚洲欧美制服中文字幕| 97久久精品人搡人人玩| 亚洲影院色在线观看免费| 欧美午夜女人视频在线| 亚洲成人教育av| 国产噜噜噜噜久久久久久久久| 久久精品91久久久久久再现| 中文字幕一区电影| 久久99精品视频一区97| 亚洲乱码国产乱码精品精| 日韩电影网在线| 欧美成年人在线观看| 奇门遁甲1982国语版免费观看高清| 在线中文字幕日韩| 国产91色在线播放| 国产精品国模在线| 欧美精品在线第一页| 中文字幕日韩在线播放| 91av在线国产| 久久免费国产精品1| 浅井舞香一区二区| 欧美怡春院一区二区三区| 美女撒尿一区二区三区| 91中文字幕在线观看| 亚洲黄色片网站| 国产精品久久91| 国产精品免费看久久久香蕉| 成人情趣片在线观看免费| 91精品久久久久久久久久另类| 日本成人激情视频| 97免费中文视频在线观看| 性欧美xxxx视频在线观看| 日本不卡高字幕在线2019| 亚洲欧美国内爽妇网| 91日韩在线播放| 久久久免费精品视频| 国产在线拍揄自揄视频不卡99| 亚洲精品电影网| 色偷偷av一区二区三区乱| 91在线色戒在线| 91日本在线观看| 精品国产精品三级精品av网址| 日韩在线观看免费高清完整版| 成人免费视频a| 国产人妖伪娘一区91| 456亚洲影院| 欧美国产日韩免费| 成人精品视频久久久久| 91欧美精品成人综合在线观看| 国内精品视频久久| 久久久久久久香蕉网| 亚洲精品白浆高清久久久久久| 45www国产精品网站| 亚洲性猛交xxxxwww| 伊人一区二区三区久久精品| 欧美精品激情在线观看| 国产盗摄xxxx视频xxx69| 激情久久av一区av二区av三区| 亚洲第一精品夜夜躁人人躁| 亚洲精品久久7777777| 米奇精品一区二区三区在线观看| 国产69精品久久久久99| 欧美精品激情视频| 一区二区三区美女xx视频| 4k岛国日韩精品**专区| 久久久999国产精品| 国产在线视频一区| 亚洲国产精品中文| 91在线观看免费| 国产日韩在线一区| 日韩精品高清在线| 久久777国产线看观看精品| 国产日韩精品一区二区| 91精品国产高清自在线看超| 久久久精品在线观看| 久久视频国产精品免费视频在线| 欧美午夜精品久久久久久浪潮| 97视频在线观看网址| 亚洲人成77777在线观看网| 精品中文字幕在线观看| 欧美人与性动交| 日韩av高清不卡| 久久成人综合视频| 久久亚洲国产精品成人av秋霞| 亚洲视频在线观看网站| 亚洲日本中文字幕免费在线不卡| 欧美午夜宅男影院在线观看| 色综合男人天堂| 亚洲一区二区三区四区在线播放| 国产成人精品在线播放| 日韩av网站大全| 亚洲第一二三四五区| 欧美性jizz18性欧美| 成人性生交大片免费看小说| 国产精品扒开腿做爽爽爽视频| 亚洲摸下面视频| 国产亚洲激情在线| 亚洲va码欧洲m码| 国内伊人久久久久久网站视频| 欧美国产日韩免费| 日韩免费电影在线观看| 色哟哟网站入口亚洲精品| 欧美日韩国产91| 亚洲最新av在线| 国产精品丝袜久久久久久不卡| 国产精品h在线观看| 久久成人一区二区| 国产精品久久久久av免费| 九色精品免费永久在线| 久久久亚洲精品视频| 亚洲精品在线看| 日韩在线一区二区三区免费视频| 欧美激情在线有限公司| 久久久精品2019中文字幕神马| 欧美日韩中文字幕综合视频| 日本成人精品在线| 国产不卡视频在线| 久久精品久久精品亚洲人| 国产精品欧美日韩一区二区| 欧美限制级电影在线观看| 欧美性猛交xxxx偷拍洗澡| 狠狠综合久久av一区二区小说| 亚洲成年人在线播放| 成人久久一区二区| 欧美日本精品在线| 国产精品专区第二| 91亚洲午夜在线| 亚洲第一级黄色片| 亲爱的老师9免费观看全集电视剧| 成人国产精品久久久| 亚洲一区二区三区在线免费观看| 欧美人在线观看| 91情侣偷在线精品国产| 久久色精品视频| 成人激情电影一区二区| 欧美日韩另类字幕中文| 欧美日韩国产va另类| 国语对白做受69| 92福利视频午夜1000合集在线观看|