JavaScriptインジェクションの新しい外観

私は最近、次のタスクに遭遇しました-一連のメソッドを持つ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



All Articles