如何修复ES6代理中封装的XMLHttpRequest上的"TypeError:非法调用"



我正在为XMLHttpRequests编写一个代理,以强制它们返回特定的状态代码。我可以在代理上运行函数,但设置失败,出现TypeError:Illegal Invocation。在下面的示例中,这种情况发生在线路oReq.responseType = "json";上。如果删除该行,它就可以工作,但我需要能够设置XHR的属性。

XMLHttpRequest = new Proxy(XMLHttpRequest, {
construct:function(t,a){
const req = new t();
return new Proxy(req, {
get:function(o,p){
if(p=='status')return 9001
return typeof o[p] == 'function'?o[p].bind(o):o[p]
},
set: function(target, prop, value, receiver) {
Reflect.set(target, prop, value, receiver)
return true;
},
})
}
})
var oReq = new XMLHttpRequest();
oReq.addEventListener("load", transferComplete);
oReq.addEventListener("error", transferComplete);
oReq.open("GET", "https://blossom-emery.glitch.me/yo.json");
oReq.responseType = "json"; // TypeError: Illegal Invocation
oReq.send()
console.log(oReq)
function transferComplete(evt) {
console.log(evt);
console.log(oReq.status,oReq.response);
}

对于像XMLHttpRequest上的那些本机方法,您不能使用代理作为接收器,所以您必须使用Reflect.set(target, prop, value, target)(或省略接收器参数(。您也可以在这里简单地使用target[prop] = value。与Reflect.get类似,您已经选择使用target[prop]

最新更新