JavaScript反射と依存注入例の詳細な解説
3945 ワード
本論文の実例は、JavaScriptの反射と依存注入について述べている.皆さんに参考にしてあげます.具体的には以下の通りです.
javascriptでの反射の理解については、配列を利用してフィードバック関数を保存し、その後適切なタイミングでコールまたはapply方法を利用して、コールバックを呼び出すという考えがあります.普通は以下のように操作します.
まず二つの方法を定義します.
これも比較的成熟しているokの考えです.
しかし、まだいくつかの問題があります.
1 resoliveは呼び出しを行う時、depsパラメータリストの順序は一致していなければなりません.
2この点はちょっと無理ですが、まあいいです.呼び出し時にもう一度入力する必要があります.直接に呼び出すことはできません.
以上の問題を解決するために、以下の解決策を示します.
コールは以下のようにできます.
これは間違いではない.空の値は、実際には「Other」パラメータ(プレースホルダ)を表します.これはパラメータ順序をどのように制御するかを示している.
最後にもう一つの方法があります.直接にscopeを注入します.つまり、直接に作用領域を注入します.作用領域が注入されます.つまり、上記のような伝染順の問題はありません.
伝達パラメータが必要ではないので、直接に作用領域からアクセスできます.
もっと多くのJavaScriptに関する内容について興味がある読者は、当駅のテーマを見ることができます.「javascript対象入門教程」、「JavaScriptエラーとデバッグ技術のまとめ」、「JavaScriptデータ構造とアルゴリズム技術のまとめ」、「JavaScript巡回アルゴリズムとテクニックの総括」及び「JavaScript数学演算の使い方のまとめ」
本論文で述べたように、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プログラムの設計に役に立ちます.