0

我正在考虑管理客户端上 JavaScript 行为的方法。

假设在我的 HTML 页面的顶部,我有...

<script>

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

};

随后是否可以(在同一页面上)访问本机XMLHttpRequest对象?

(显然,从安全的角度来看,这不是防止 XSS 的最佳方法——这不是问题)。

4

2 回答 2

3

由于XMLHttpRequest它是window对象的属性,因此您仍然应该能够通过它访问它。

你实际上并没有覆盖它,你只是隐藏了它的本机属性,window所以任何时候你试图XMLHttpRequest在你的声明范围内调用,你的覆盖版本将首先在范围链中遇到并因此被执行。如果您明确访问window.XMLHttpRequest,您将绕过您的覆盖版本并直接访问本机版本:

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

请注意,如果您没有使用var关键字声明您的版本,您实际上会覆盖本机函数,在这种情况下,您可以通过删除新属性来取回它(但不能在 Internet Explorer 中):

delete window.XMLHttpRequest;

编辑

我刚刚意识到上述内容有点误导。如果省略var关键字,则实际上并没有覆盖原始函数,您仍然只是遮盖它。那是因为原始函数是在window构造函数的原型上声明的。

于 2012-05-02T08:29:47.860 回答
0

在 FF12 中,这是一个完全有效的覆盖。之后 XMLHttpRequest 将不再可用。

请记住,其他浏览器使用可能无法以这种方式访问​​的其他方法;我没有测试过这些。

编辑:在 IE9 中也进行了测试,XHR 也不再在那里工作了。

于 2012-05-02T08:28:48.013 回答