2012-05-02 42 views
0

我正在考慮如何管理客戶端上的JavaScript行爲。重寫的函數/方法仍可訪問嗎?

假設在我的HTML頁面,我頂...

<script> 

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

}; 

是否有可能隨後(在同一頁面上)訪問本地XMLHttpRequest對象?

(顯然,從安全角度來看,這不是防止XSS的最佳方式 - 這不是問題)。

回答

3

由於XMLHttpRequestwindow對象的屬性,因此您仍然應該可以通過它訪問它。

您還沒有真正覆蓋它,你只有陰影的window的原生屬性,所以你嘗試任何時間打電話給XMLHttpRequest在聲明的範圍,你重寫版本將首先遇到的作用域鏈,因此執行。如果你明確地訪問window.XMLHttpRequest你會繞過你的重寫版本,並直接訪問本機之一:如果你沒有宣佈與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也不再工作了。

相關問題