Переопределение метода отправки XMLHttpRequest

Я пытаюсь войти (и позже изменить) данные, которые XMLHttpRequest отправляет на сервер, переопределив функцию отправки XMLHttpRequest. Моя функция правильно записывает данные в консоль, но запрос не завершается, поэтому браузер продолжает ждать ответа неопределенно долго. Есть идеи, что не так с кодом?

XMLHttpRequest.prototype.realSend = XMLHttpRequest.prototype.send;
var newSend = function(vData) { console.log("data: " + vData); realSend(vData); };
XMLHttpRequest.prototype.send = newSend;

2 ответов


XMLHttpRequest.prototype.realSend = XMLHttpRequest.prototype.send;
// here "this" points to the XMLHttpRequest Object.
var newSend = function(vData) { console.log("data: " + vData); this.realSend(vData); };
XMLHttpRequest.prototype.send = newSend;

вы забыли this:

this.realSend(vData);

однако вам не нужно добавлять новый метод в прототип:

var send = XMLHttpRequest.prototype.send;

XMLHttpRequest.prototype.send = function(data) {
    send.call(this, data);
}

используя закрытие, вы также можете избежать переменных-изгоев:

!function(send){
    XMLHttpRequest.prototype.send = function (data) {
        send.call(this, data);
    }
}(XMLHttpRequest.prototype.send);