2011-01-26 14 views
5

Estos métodos que vienen a la mente, ¿cuáles son los pros y los contras de cada uno?¿Cómo puedo crear un envoltorio/proxy XMLHttpRequest?

Método 1: Aumentar instancia nativa

var _XMLHttpRequest = XMLHttpRequest; 
XMLHttpRequest = function() { 
    var xhr = new _XMLHttpRequest(); 

    // augment/wrap/modify here 
    var _open = xhr.open; 
    xhr.open = function() { 
     // custom stuff 
     return _open.apply(this, arguments); 
    } 

    return xhr; 
} 

Método 2: Sub "clase" XMLHttpRequest nativa

var _XMLHttpRequest = XMLHttpRequest; 
XMLHttpRequest = function() { 
    // definePropertys here etc 
} 

XMLHttpRequest.prototype = new _XMLHttpRequest()); 
// OR 
XMLHttpRequest.prototype = Object.create(_XMLHttpRequest); 

// custom wrapped methods on prototype here 
XMLHttpRequest.prototype.open = function() { 
    // custom stuff 
    return _XMLHttpRequest.prototype.open.apply(this, arguments); 
} 

Método 3: proxy completo a XMLHttpRequest nativa

var _XMLHttpRequest = XMLHttpRequest; 
XMLHttpRequest = function() { 
    this.xhr = new _XMLHttpRequest(); 
} 

// proxy ALL methods/properties 
XMLHttpRequest.prototype.open = function() { 
    // custom stuff 
    return this.xhr.open.apply(this.xhr, arguments); 
} 
+0

Su primer método me parece incorrecto. Me temo que entrarás en un bucle recursivo hasta que obtengas un desbordamiento de pila. ;) ¿Y por qué quieres esto de todos modos? Hay muchas soluciones más ordenadas, que no tienen que proporcionar llamadas de función a un objeto referenciado. –

+0

Marcel: tienes razón, era un tipo, lo he arreglado. – tlrobinson

+3

ThiefMaster: la mayoría de mis preguntas nunca se responden adecuadamente ... – tlrobinson

Respuesta

2

Dependiendo en el motor JS, el método 1 produce una sobrecarga considerable, ya que xhr.open es redefinido cada vez que se crea una instancia de XHR.

El método 2 me hace pensar "¿por qué necesitaría el new _XMLHttpRequest en primer lugar"? Hay una sensación menor de efectos secundarios no deseados, pero parece funcionar bien.

Método 3: simple, de la vieja escuela, pero no funcionará de inmediato. (Piense en leer propiedades)

En general, personalmente soy reticente cuando se trata de sobreescribir objetos del navegador, por lo que sería una gran estafa para los tres métodos. Es mejor usar alguna otra variable como ProxyXHR (solo mis 2 centavos)

0

Puede depender del caso de uso. En mi caso, quería crear un proxy completo que parece ser posible solo con el tercer método. El problema es que onreadystatechange debe establecerse en la implementación XHR original. Supongo que hay getter y setter definidos que no se pueden cambiar desde afuera.

Debido a este método 1 y 2 no funcionarán. Para lograr esto escribí un completo, lo que significa que no encontré ningún error, proxy para XHR aquí: A: How can I catch and process the data from the XHR responses using casperjs?. Tiene que ser hecho con el método 3.

0

Utilizar el siguiente config

_XMLHTTPRequest.setProxy(proxySetting, varProxyServer, varBypassList);

Parámetros Detalles: proxySetting - configuración de proxy ejemplo: SXH_PROXY_SET_DEFAULT, SXH_PROXY_SET_DIRECT, SXH_PROXY_SET_PROXY, SXH_PROXY_SET_PRECONFIG

varProxyServer - El nombre de un servidor proxy

varBypassList - nombres de host o direcciones IP para whi Si desea permitir el desvío del servidor proxy.

Cuestiones relacionadas