Переопределение метода отправки 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);

Предполагая, что изменяемые данные представляют собой строку JSON, вы можете написать такой перехватчик:

// Closure to contain variables and ! to avoid possible concatenation issues with other codes.
!function(){
  XMLHttpRequest.prototype._original_send = XMLHttpRequest.prototype.send;
  let interceptor_send = function(data){
    try {
      // Adding data to the JSON string, 
      // translating in JSON object to validate it's content and add an attribute.
      obj = JSON.parse(data);
      obj._custom_added_data = 'Your data';
      let new_data = JSON.stringify(obj);
      this._original_send(new_data);
    }
    catch(err) {
      // In case the payload was not a JSON string,
      // do not add anything and send the original payload.
      this._original_send(data);
    }

};
XMLHttpRequest.prototype.send = interceptor_send;
}();

Другие вопросы по тегам