猴子修补XMLHttpRequest.prototype.open和“触摸”参数

时间:2014-10-07 18:52:34

标签: javascript internet-explorer xmlhttprequest monkeypatching

我正在尝试为在IE8兼容模式下运行的Intranet站点添加补丁XMLHttpRequest.prototype.open,但它不断抛出SCRIPT438: Object doesn't support this property or method。奇怪的是......如果我首先“触摸”arguments,即取消注释bar,它就可以了!有谁知道为什么,如果触摸它确实在100%的情况下解决了问题?

var foo = window.XMLHttpRequest.prototype.open;
window.XMLHttpRequest.prototype.open = function() {
  //var bar = arguments;
  foo.apply(this, arguments);
  console.log("OK");
}

以下是IE8模式中的IE9现代。使用Google图片搜索的VM屏幕截图,尝试open滚动的猴子修补请求。

enter image description here

编辑:

console.log(foo);
//console.log(foo.apply);
console.log(typeof foo);
console.log(foo instanceof Function);

返回

LOG: 
function open() {
    [native code]
}

LOG: object 
LOG: false  

console.log(foo.apply)投掷"Object doesn't support this property or method"

有趣的是,我无法在我试过的任何模式下在实际的IE8虚拟机中复制这个,只能在IE8标准模式下运行IE9。

2 个答案:

答案 0 :(得分:0)

我刚刚看到一个XMLHttpRequest.prototype.open被覆盖的例子,其方法与你的略有不同;

(function(open) {
    XMLHttpRequest.prototype.open = function() {
        // your special sauce

        open.apply(this, arguments);
    };
})(XMLHttpRequest.prototype.open);

你能检查一下,看看这样做是否有所不同?

答案 1 :(得分:0)

var XHR = XMLHttpRequest.prototype;
XHR.open = function (method, url) {
  //do stuff

  return open.apply(this, arguments);
};