2012-05-02 10 views
0

私はクライアント上でJavaScriptの動作を管理する方法について考えています。オーバーライドされた関数/メソッドは引き続きアクセスできますか?

<script> 

var XMLHttpRequest = function() { 
    this.send = function() { 
    alert(args.toString()); 
    } 

}; 

は、ネイティブXMLHttpRequestオブジェクトにアクセスする(同じページに)それが、その後は可能です...私は、私のHTMLページの上部にあると仮定しますか?

(明らかに、セキュリティ上の観点から、これはXSSを防止する最良の方法ではありません - それは問題ではありません)。

答えて

3

XMLHttpRequestwindowオブジェクトのプロパティであるため、それでもそのオブジェクトにアクセスできるはずです。あなたが実際にそれを上書きしていない

、あなたはあなたの宣言のスコープでXMLHttpRequestを呼び出そうとする任意の時間は、あなたのオーバーライドされたバージョンは、スコープチェーンに最初に遭遇し、そのために実行されますので、windowのネイティブプロパティを唯一の影にしています。あなたが明示的window.XMLHttpRequestにアクセスした場合、あなたはあなたのオーバーライドされたバージョンを迂回し、直接ネイティブの1にアクセスします:あなたはvarキーワードとバージョンを宣言していなかった場合、あなたが実際にネイティブ関数をオーバーライドして、中にいるであろうと

var XMLHttpRequest = function() { 
    console.log('example'); 
} 
var request = new XMLHttpRequest(); //Calls the above function 
var request2 = new window.XMLHttpRequest(); //Calls the native function 

注意をあなたは新しいプロパティを削除することによって(ただし、Internet Explorerで)それを取り戻すことができ、その場合:

delete window.XMLHttpRequest; 

編集

私はちょうど再上述のことは少し誤解を招く。 varキーワードを省略した場合、元の関数を実際に上書きすることはなく、まだシャドーイングしています。これは、元の関数がwindowコンストラクタのプロトタイプで宣言されているためです。

0

FF12では、完全に有効なオーバーライドです。その後、XMLHttpRequestは使用できなくなります。

他のブラウザでは、他の方法ではアクセスできない可能性があります。私はそれらをテストしていない。

編集:IE9でもテストされていますが、XHRもこれ以上動作しませんでした。

関連する問題