JavaScript反射と依存注入例の詳細な解説

3945 ワード

本論文の実例は、JavaScriptの反射と依存注入について述べている.皆さんに参考にしてあげます.具体的には以下の通りです.
javascriptでの反射の理解については、配列を利用してフィードバック関数を保存し、その後適切なタイミングでコールまたはapply方法を利用して、コールバックを呼び出すという考えがあります.普通は以下のように操作します.
まず二つの方法を定義します.

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

もう一つの関数があります.この二つのモジュールを使う必要があります.

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

もちろん、私達は注入に依存する方式を使って、このコントロールをコンピュータに任せて、人為的なものではなくて、次のように呼びかけたいです.

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");

私たちは次のように反射法を作ることができます.

var injector ={
    dependencies: {},
    register: function(key, value) {
      this.dependencies[key] = value;
    },
    resolve:function(deps, func, scope) {
      var args = [];
      for(var i=0; i 
 
上記のコードのように、dependenciesはコールバック関数のセットを保存するために使用されます.
これも比較的成熟しているokの考えです.
しかし、まだいくつかの問題があります.
1 resoliveは呼び出しを行う時、depsパラメータリストの順序は一致していなければなりません.
2この点はちょっと無理ですが、まあいいです.呼び出し時にもう一度入力する必要があります.直接に呼び出すことはできません.
以上の問題を解決するために、以下の解決策を示します.

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 
 
正則を利用してコードを解析し、Functionリストのパラメータを解析して、一つの自動マッチングの伝達値を実行すれば解決できます.順序はずっと問題があります.もちろんこれも一番熱いmvmフレームAnglarJsが取る方式です.
コールは以下のようにできます.

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

最初のパラメータの後ろにコンマが二つあることに気づくかもしれません.注意してください.
これは間違いではない.空の値は、実際には「Other」パラメータ(プレースホルダ)を表します.これはパラメータ順序をどのように制御するかを示している.
最後にもう一つの方法があります.直接にscopeを注入します.つまり、直接に作用領域を注入します.作用領域が注入されます.つまり、上記のような伝染順の問題はありません.
伝達パラメータが必要ではないので、直接に作用領域からアクセスできます.

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 
 
javascriptは反射して新しい理解を注入しますに頼って、記録の、忘れないように注意します.
もっと多くのJavaScriptに関する内容について興味がある読者は、当駅のテーマを見ることができます.「javascript対象入門教程」、「JavaScriptエラーとデバッグ技術のまとめ」、「JavaScriptデータ構造とアルゴリズム技術のまとめ」、「JavaScript巡回アルゴリズムとテクニックの総括」及び「JavaScript数学演算の使い方のまとめ」
本論文で述べたように、JavaScriptプログラムの設計に役に立ちます.