我正在为XMLHttpRequest
s编写一个代理,以强制它们返回特定的状态代码。我可以在代理上运行函数,但设置失败,出现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]
。