欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

JavaScript反射與依賴注入實(shí)例詳解

本文實(shí)例講述了JavaScript反射與依賴注入。分享給大家供大家參考,具體如下:

在鄯善等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供網(wǎng)站制作、網(wǎng)站設(shè)計(jì) 網(wǎng)站設(shè)計(jì)制作按需定制,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),成都全網(wǎng)營(yíng)銷推廣,外貿(mào)網(wǎng)站建設(shè),鄯善網(wǎng)站建設(shè)費(fèi)用合理。

對(duì)于javascript中的反射的理解,一直都是認(rèn)為,利用數(shù)組對(duì)回調(diào)函數(shù)進(jìn)行保存,之后在適當(dāng)?shù)臅r(shí)刻利用call或是apply 方法,對(duì)回調(diào)進(jìn)行調(diào)用即可,一般如下操作:

首先定義兩個(gè)方法:

var service = function() {
  return { name: 'Service' };
}
var router = function() {
  return { name: 'Router' };
}

我們有另一個(gè)函數(shù)需要用到這兩個(gè)模塊。

var doSomething = function(other) {
  var s = service();
  var r = router();
};

當(dāng)然,我們希望能夠能夠使用依賴注入的方式去做,把該控制權(quán)交給計(jì)算機(jī)去做,而不是人為的去調(diào)用如下:

var doSomething = injector.resolve('router,,service', function(a, b, c) {
  expect(a().name).to.be('Router');
  expect(b).to.be('Other');
  expect(c().name).to.be('Service');
});
doSomething("Other");

那么我們可以造出一個(gè)反射方法如下:

var injector ={
    dependencies: {},
    register: function(key, value) {
      this.dependencies[key] = value;
    },
    resolve:function(deps, func, scope) {
      var args = [];
      for(var i=0; i<deps.length, d=deps[i]; i++) {
        if(this.dependencies[d]) {
          args.push(this.dependencies[d]);
        } else {
          throw new Error('Can\'t resolve ' + d);
        }
      }
      return function() {
        func.apply(scope || {}, args.concat(Array.prototype.slice.call(arguments, 0)));
      }
    }
};

如上代碼,dependencies 用來(lái)保存回調(diào)函數(shù)集合,resolve用來(lái)調(diào)用。

這也算是一個(gè)比較成熟ok的想法。

但是依舊存在幾點(diǎn)問(wèn)題:

1 resolve 在進(jìn)行調(diào)用時(shí),deps參數(shù)列表順序必須保持一致。

2 這一點(diǎn)有點(diǎn)牽強(qiáng),但是也算。在調(diào)用時(shí),需要再一次的輸入形參,而不能直接調(diào)用。

那么為了解決以上問(wèn)題,給出以下解決方案:

var injector ={
    dependencies: {},
    register: function(key, value) {
      this.dependencies[key] = value;
    },
    resolve: function() {
      var func, deps, scope, args = [], self = this;
      if(typeof arguments[0] === 'string') {
        func = arguments[1];
        deps = arguments[0].replace(/ /g, '').split(',');
        scope = arguments[2] || {};
      } else {
        func = arguments[0];
        deps = func.toString().match(/^function\s*[^]*\(\s*([^]*\(\s*([^]*)\)/m)[1].replace(/ /g, '').split(',');
        scope = arguments[1] || {};
      }
      return function() {
        var a = Array.prototype.slice.call(arguments, 0);
        for(var i=0; i<deps.length; i++) {
          var d = deps[i];
          args.push(self.dependencies[d] && d != '' ? self.dependencies[d] : a.shift());
        }
        func.apply(scope || {}, args);
      }
    }
};

利用正則對(duì)代碼進(jìn)行解析,解析出function 列表參數(shù),再進(jìn)行一一自動(dòng)匹配傳值,那么即可解決,順序必須一直問(wèn)題,當(dāng)然這也是當(dāng)然最熱mvvm框架AngularJs采取的方式。

調(diào)用方式可以如下:

injector.resolve(['service,,router', function(service, router) {
}]);

你可能注意到在第一個(gè)參數(shù)后面有兩個(gè)逗號(hào)——注意

這不是筆誤??罩祵?shí)際上代表“Other”參數(shù)(占位符)。這顯示了我們是如何控制參數(shù)順序的。

最后還有一種方式,直接注入scope ,也就是直接注入作用域,那么作用域被注入,也就不存在上述的傳參順序問(wèn)題

因?yàn)椴辉谛枰獋鬟f參數(shù),直接可以從作用域中訪問(wèn)到。

var injector = {
  dependencies: {},
  register: function(key, value) {
    this.dependencies[key] = value;
  },
  resolve: function(deps, func, scope) {
    var args = [];
    scope = scope || {};
    for(var i=0; i<deps.length, d=deps[i]; i++) {
      if(this.dependencies[d]) {
        scope[d] = this.dependencies[d];
      } else {
        throw new Error('Can\'t resolve ' + d);
      }
    }
    return function() {
      func.apply(scope || {}, Array.prototype.slice.call(arguments, 0));
    }
  }
}
var doSomething = injector.resolve(['service', 'router'], function(other) {
  expect(this.service().name).to.be('Service');
  expect(this.router().name).to.be('Router');
  expect(other).to.be('Other');
});
doSomething("Other");

javascript反射依賴注入新的理解,記錄之,謹(jǐn)防忘記.

更多關(guān)于JavaScript相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《javascript面向?qū)ο笕腴T教程》、《JavaScript錯(cuò)誤與調(diào)試技巧總結(jié)》、《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》、《JavaScript遍歷算法與技巧總結(jié)》及《JavaScript數(shù)學(xué)運(yùn)算用法總結(jié)》

希望本文所述對(duì)大家JavaScript程序設(shè)計(jì)有所幫助。

新聞標(biāo)題:JavaScript反射與依賴注入實(shí)例詳解
網(wǎng)頁(yè)URL:http://www.aaarwkj.com/article28/pdejcp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)頁(yè)設(shè)計(jì)公司網(wǎng)站設(shè)計(jì)、定制開(kāi)發(fā)、App開(kāi)發(fā)外貿(mào)網(wǎng)站建設(shè)、網(wǎng)站策劃

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都seo排名網(wǎng)站優(yōu)化
亚洲精品成人久久国产| 亚洲麻豆精品午夜免费| 一本色桃子精品久久中文字幕| 日本激情诱惑免费在线播放| 亚洲激情自拍偷拍视频| 国产农村熟妇av国语对白| 国产精品一区二区激情视频| 91精品国产综合久久男男| 青青草原精品资源视频| 色哟哟网站一区二区精品久久| 国产精品毛片在线看不卡| 久草国产免费福利在线视频| 日韩一区二区中文字幕| 久久综合给合综合久久| 精品爆白浆一区二区三区| 亚洲香蕉av在线一区二区三区| 国产福利精品一区二区av | 日韩无遮挡免费在线观看| 黄色大全欧美在线观看| 久久精品一品二品三品| 青青草原精品视频在线| 尤物视频精品在线观看| 女子张开腿让男人捅爽| 久久久国产精品调教网站| 国产一区999精品在线| 欧美中文字幕内射合集| 久久久之久亚州精品露出| 精品熟妇人妻一区二区三区| 国产亚洲一线二线三线| 免费中文字幕av电影| 国产精品成人免费久久黄| 一区二区三区免费视频少妇| 97在线观看视频视频| 99精品人妻一区二区三区| 亚洲欧美天堂一区二区| 国产精品久久一区二区三区蜜桃| 久久99久久久国产精品| 开裆丝袜高跟啪啪高潮av| 色噜噜色一区二区三区| 欧美日韩电影一区二区三区在线观看| 中文字幕在线五月婷婷|