想到这些方法,每种方法的优缺点是什么?
方法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);
}
答案 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地址。