1

javascript alert() ネイティブ コールをインターセプトし、実際の実行前にユーザー コードをフックできることがわかりました。サンプルコードをチェックしてください..

  function Test(){
    var alertHook=function(aa){
     this.alert(aa);
    }

    this.alert("aa");
       this.alert = alertHook;
    alert("aa");
  }

したがって、alert("aa") を呼び出すたびに、alertHook ローカル関数によってインターセプトされます。しかし、小さな変更を加えた以下の実装は機能しません。

  function Test(){
    var alertHook=function(aa){
     alert(aa);
    }

    alert("aa");
       alert = alertHook;  //throws Microsoft JScript runtime error: Object doesn't support this action
    alert("aa");
  } 

Microsoft JScript runtime error: Object does not support this action がスローされます。

この.alert = alertHook;がどうなるかわかりません。通話を傍受させてください。ただし、alert=alertHook; いいえ。??

したがって、これを使用してネイティブ js メソッドをインターセプトすると仮定します。そうですか?

そして、それは受け入れられますか?このようにして、ネイティブJS呼び出しを独自のメソッドに完全に置き換えることができるから??

アップデート:

私は尋ねました、それは受け入れられますか?これは、eval() を使用してユーザーがネイティブ関数呼び出しを置き換えることができる優れたアプローチであるためです。

そして、開発者を誤解を招く機能から保護するという言語の責任、ウィンドウ レベル (または共通のフレームワーク js ファイル) でネイティブ js 呼び出しを置き換えると、システム全体がクラッシュします..そうではありませんか??

この機能の背後にある理由を理解していないため、私の意見が間違っている可能性があります..? 開発者が独自の実装を置き換えることができる言語を見たことがありません..

4

3 に答える 3

3

Test();が呼び出される方法に応じてthiswindowオブジェクトになります。

Microsoft は、window オブジェクトを指定することによってのみ、ネイティブ JS 関数の上書きを許可していると思います。

したがって、window.alert = alertHook;どこでも動作するはずです。


それは受け入れられますか?

はい、そうです。これは言語の柔軟性にとって大きな強みですが、ネイティブの動作を上書きするよりも優れた代替手段があると確信しています。

ネイティブの JavaScript 関数を上書きすることは、実際にはセキュリティ上の問題ではありません。それを実行する他の誰かのコードを実行している場合、それは1つの可能性があります。しかし、他人のコードを実行している場合は、他にも多くのセキュリティ上の問題に注意する必要があります。

于 2010-01-19T13:07:03.753 に答える
0

私の意見では、ネイティブ関数を再定義することは決して良い習慣ではありません。ラッパーを使用する方が良いです (たとえば、debug出力を呼び出しに送るか無視する関数をalert作成console.logするか、ニーズに合ったものを作成します)。

JScript が最初の例ではなく 2 番目の例で例外をスローする理由については、簡単です。alert最初の例では、ローカル スコープで呼び出されるプロパティを作成するため、参照するときはではなく参照alertすることになります。2 番目の例では、参照している は のものであるため、別の関数を割り当てると失敗します。this.alertwindow.alertalertwindow

于 2010-01-19T13:17:07.500 に答える
0

そして、開発者を誤解を招く機能から保護するという言語の責任、ウィンドウ レベル (または共通のフレームワーク js ファイル) でネイティブ js 呼び出しを置き換えると、システム全体がクラッシュします..そうではありませんか??

そうではありません。ネイティブ呼び出しを置き換えると、それにフックされ、置き換えられます。ネイティブはまったく書き換えられません。「全体」システムのクラッシュ。JavaScript は仮想マシンで実行され、解釈されるため、「全体」システム (つまり、ブルー スクリーン オブ デス?) がクラッシュする可能性は非常に小さいです。もしそうなら、それはプログラマーのせいではなく、エラーの原因となっている JavaScript の実装です。

これは機能と考えることができます。たとえば、他の人の手から JavaScript を読み込んだ場合、いくつかの機能を再実装して拡張することができます。

プログラマーを保護することは、犬をひもにつないでおくようなものです。犬を信頼している場合にのみ、放してください。JavaScript は仮想マシンで実行されるため、実装が十分に安全である場合 (ほとんどの場合?)、どのプログラマーでも自由に使用できます。

于 2010-01-19T13:45:43.273 に答える