被覆盖的函数/方法是否仍然可访问?

时间:2012-05-02 08:21:58

标签: javascript overloading

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

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

<script>

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

};

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

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

2 个答案:

答案 0 :(得分:3)

由于XMLHttpRequestwindow对象的属性,您仍然可以通过它访问它。

您实际上没有覆盖它,您只隐藏了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构造函数的原型上声明的。

答案 1 :(得分:0)

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

请记住其他浏览器使用其他可能无法访问的方法;我没有测试过那些。

编辑:同样在IE9中测试过,XHR也不再适用了。