私は最近、次のタスクに遭遇しました-一連のメソッドを持つJavaScriptアクションオブジェクトがあり、それぞれに次の変数を定義する必要があります。
var persik =これ、
アクション= persik.actions、
next =(persik.dom.possibly MUCH WHAT.thisMethod.nextの名前は何ですか)?
persik.dom.ThisMethod.nextのより多くのTHAT.name:function(){return false};
しかし、私は実際にそれらを定義したくありませんでした。第一に、コードが著しく重くなり、第二に、Persikフレームワークの将来のユーザーのためにアクションオブジェクトが作成されました。そして、誰もが既製のアクションを使用できるだけでなく、独自のアクションを定義できると想定されています
もちろん、ドキュメントに「みんな、作成する各メソッドの先頭にこれらの行を挿入してください」と書くことも、変数をまったく作成してpersikの代わりにこれを書くこともできません(これには問題があるかもしれませんが)、アクションの代わりにこれを書いてください.actions、およびnext()を呼び出す代わりに、次のようにぼかします:
if(this.dom.possiblyMore、THAT.name of thisMethod.next)this.dom.maybeMoreWhat that.name of thisMethod.next();
しかし、これらすべてはひどく美しくもなく、正しくもありません。 考え方は単純です-フレームワークを初期化するとき、アクションオブジェクトのすべてのメソッドを調べ、toString()を使用して各メソッドを文字列として取得し、必要な変数定義の行をそこに簡単に挿入し、eval()を使用して文字列から関数を作成し、既存のメソッドを変更したメソッドで置き換えます。 私のフレームワークでアクション内のメソッドを検索するためのソースコードは提供しませんので、世間を煩わせませんが、メソッドの変更は次のようになります。
_rewriteFunc:関数(func、funcName、variablesStr){
var funcArr = func.toString()。split( '{');
variablesStr = variablesStr.replace(/ \ [funcName \] / g、funcName);
funcArr [1] = variablesStr + funcArr [1];
var resultFunc = funcArr.join( '{');
eval( 'var a =' + resultFunc);
を返します;
}、
ここでfuncは実際に変更可能なメソッドであり、このメソッドの名前はfuncNameに渡され、すべての親、つまり this.dom.thisMethodと同じthis.dom.possibly MORE THAT.name、およびvariablesStrには、定義した変数を含む文字列が含まれます。 私の場合、「var persik = this;」です。 var actions = persik.actions; var next =([funcName] .next)? [funcName] .next:function(){return false}; '。 上記の関数は、variablesStrのすべての '[funcName]'をfuncNameに置き換え、最初の文字 '{'の後にvariableStrをresultFuncに挿入し、文字列から関数を再度収集して返します。 上記のすべての倒錯が実行されるアクションオブジェクトは、次の
場所で表示できます:
nikitaeremin.com/js/action.jsこの手法には、いくつかの欠点があります。
-変数persik、actions、nextは、actionsオブジェクトのすべてのメソッドで作成されますが、メソッドによっては、要求されないままになる場合があります。
-JavaScriptのソースコードが変更され、実行期間中にエラーが発生した場合、FireBugは、エラーの原因は正しいものの、実際にエラーを引き起こしたすべての行を誓いません。
-残りのマイナスは今や一般大衆によって私に言われます:)
上記のトリックは広範囲のタスクに適用できるとは思いませんが、この記事は一般的な開発の可能性が高いと思いますが、誰かがそのような注入のアプリケーションの他の分野に関するアイデアを共有したい場合は、石鹸に書いてください:nikitaeremin [at] gmail.com