如何创建XMLHttpRequest包装器/代理?

时间:2011-01-26 19:56:31

标签: javascript xmlhttprequest

想到这些方法,每种方法的优缺点是什么?

方法1:扩充本机实例

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;
}

方法2:子“类”原生XMLHttpRequest

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);
}

方法3:完全代理原生XMLHttpRequest

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);
}

4 个答案:

答案 0 :(得分:2)

取决于JS引擎,方法1产生相当大的开销,因为只要XHR被实例化,就会重新定义xhr.open

方法2让我想到“为什么你首先需要new _XMLHttpRequest”?有一种不良副作用的轻微感觉,但看起来效果很好。

方法3:简单,老派,但它不会直接起作用。 (考虑阅读属性)

一般来说,在覆盖浏览器对象时,我个人不情愿,因此这对所有三种方法都很重要。更好地使用其他变量,如ProxyXHR(只是我的2美分)

答案 1 :(得分:0)

可能取决于用例。在我的情况下,我想创建一个完整的代理,似乎只有第三种方法才有可能。问题是需要在原始XHR实现上设置onreadystatechange。我猜定定义的getter和setter无法从外部更改。

由于这种方法1和2不起作用。为了达到这个目的,我写了一个完整的,意思是我没有找到任何错误,代表XHR:A: How can I catch and process the data from the XHR responses using casperjs?。需要使用方法3来完成。

答案 2 :(得分:0)

我已经尝试了所有3。我必须从我无法管理的代码中拦截呼叫,因为该代码已经运行Boomerang AutoXHR插件并拦截了呼叫。 #2和#3只是导致了错误,但#1在我奇怪的混乱用例中表现最佳。

答案 3 :(得分:-1)

使用以下配置

_XMLHTTPRequest.setProxy(proxySetting, varProxyServer, varBypassList);

参数详情: proxySetting - 代理配置 例如:SXH_PROXY_SET_DEFAULT,SXH_PROXY_SET_DIRECT,SXH_PROXY_SET_PROXY,SXH_PROXY_SET_PRECONFIG

varProxyServer - 代理服务器的名称

varBypassList - 您要允许绕过代理服务器的主机名或IP地址。