我正在考虑管理客户端上 JavaScript 行为的方法。
假设在我的 HTML 页面的顶部,我有...
<script>
var XMLHttpRequest = function () {
this.send = function() {
alert(args.toString());
}
};
随后是否可以(在同一页面上)访问本机XMLHttpRequest
对象?
(显然,从安全的角度来看,这不是防止 XSS 的最佳方法——这不是问题)。
我正在考虑管理客户端上 JavaScript 行为的方法。
假设在我的 HTML 页面的顶部,我有...
<script>
var XMLHttpRequest = function () {
this.send = function() {
alert(args.toString());
}
};
随后是否可以(在同一页面上)访问本机XMLHttpRequest
对象?
(显然,从安全的角度来看,这不是防止 XSS 的最佳方法——这不是问题)。
由于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
构造函数的原型上声明的。
在 FF12 中,这是一个完全有效的覆盖。之后 XMLHttpRequest 将不再可用。
请记住,其他浏览器使用可能无法以这种方式访问的其他方法;我没有测试过这些。
编辑:在 IE9 中也进行了测试,XHR 也不再在那里工作了。