Подтвердить что ты не робот

Обезглавливание XMLHttpRequest.prototype.open и "касание" аргументов

Я пытаюсь установить патч обезьяны XMLHttpRequest.prototype.open для сайта интрасети, работающего в режиме совместимости с IE8, но он продолжает бросать 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");
}

Здесь IE9 в режиме IE8 modern.ie виртуальный скриншот с поиском Google Image, пытающимся open запрограммировать прокрутку обезьяны.

enter image description here

Edit:

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 в любом режиме, который я пробовал, только в IE9, работающем в стандарте IE8.

4b9b3361

Ответ 1

Недавно я увидел пример переопределения XMLHttpRequest.prototype.open с немного другим подходом, чем ваш;

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

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

Можете ли вы проверить и посмотреть, действует ли это так иначе?

Ответ 2

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

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