ホームページ > 記事 > ウェブフロントエンド > JavaScript の興味深い質問: 依存関係の注入
Dependency Injection (DI) パターンについて聞いたことがあるはずです。
バックエンドの人気のSpring フレームワークであっても、フロントエンドのトレンディな angular.js であっても、依存関係の注入はいたるところで見られます。
この用語は少しわかりにくいですが、中心となるアイデアは非常にシンプルです。 よく言われることわざを使うと、「風が欲しければ風が来るし、雨が欲しければ雨が降る」、言い換えれば、「食べ物を食べるときは、口を開けて、服があれば手を伸ばせるよ」。
私の説明を聞いてもまだ少し混乱しているかもしれませんが、最初に例を示します。 以下はいくつかのモジュールであり、「依存関係」とも呼ばれ、ハッシュオブジェクトに保存されます:
var deps = { 'firstDependency': function () {return 'this is firstDependency';}, 'secondDepency': function () {return 'this is secondDepency';}, };以下は依存性注入マネージャーであり、時期が来たら
新しいになりますOf:
var DI = function (dependency) { this.dependency = dependency; };
newでは、depsがパラメータとして渡されます。
さて、ここからが問題の核心です。何を書く必要がありますか:DI.prototype.inject = function (func) {......};この注入メソッドは DI のプロトタイプにバインドされており、パラメーターとして関数を受け取ります。 それではどうやって使うのですか?
var di = new DI(deps); var myDependentFunc = di.inject(function (secondDepency, firstDependency) { firstDependency(); secondDepency(); }); myDependentFunc();
まず、
inject によって渡される匿名関数を観察してみましょう。これは要件を表しており、注入する必要がある場所です。
secondDepency, firstDependencyここには 2 つの要件を表す 2 つのパラメータがあります。必要に応じて、これら 2 つのパラメータを分析し、関連するモジュールを見つけます。 さて、注入関数の作成に戻りますが、最初のステップでは何をすべきでしょうか? まず、inject によって渡された関数の
toString() 形式を取得します:
//第一步 DI.prototype.inject = function (func) { func.toString(); };
次に、文字列を分析し、すべての仮パラメータを見つけます:
//第二步 DI.prototype.inject = function (func) { var args = findArgs(func.toString()); };findArgs の書き方方法?正規表現または文字列のセグメント化とインターセプトを使用できます。ここでは後者を使用します。
String.prototype.trim=function(){ return this.replace(/(^\s*)|(\s*$)/g, ""); }; var findArgs = function(funcStr){ var bracket1 = funcStr.indexOf("("); var bracket2 = funcStr.indexOf(")"); var argsStr = funcStr.slice(bracket1+1,bracket2); var args = argsStr.split(","); return args.map(function(e){ return e.trim(); }); };すべての仮パラメータを見つけた後の 3 番目のステップは、モジュール ハッシュ テーブルから対応するモジュール関数を見つけ、実際のパラメータ リストに格納することです。
realArgsは実際のパラメータリストを参照します:
//第三步 DI.prototype.inject = function (func) { var args = findArgs(func.toString()); var realArgs = []; for(var i=0;i<args.length;i++){ var dep = this.dependency[args[i]]; if(dep){ realArgs.push(dep); } } //...... };
最後のステップは
injectionであり、匿名関数が実行されると、実際のパラメータリストはclosureを通じて取得されます。 、 func に注入されます。
DI.prototype.inject = function (func) { var args = findArgs(func.toString()); var realArgs = []; for(var i=0;i<args.length;i++){ var dep = this.dependency[args[i]]; if(dep){ realArgs.push(dep); } } return function(){ return func.apply(null,realArgs); }; }こうして、簡易版のインジェクション関数が完成しました。
上記は JavaScript に関する興味深い質問です: 依存性注入の内容 詳細については、PHP 中国語 Web サイト (www.php.cn) に注目してください。