How to fix `TypeError: Illegal Invocation` on an XMLHttpRequest wrapped in an ES6 Proxy
How to fix `TypeError: Illegal Invocation` on an XMLHttpRequest wrapped in an ES6 Proxy
我正在为 XMLHttpRequest
编写代理,以强制他们 return 特定的状态代码。我能够 运行 在代理上运行,但设置失败并出现类型错误: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]
。
我正在为 XMLHttpRequest
编写代理,以强制他们 return 特定的状态代码。我能够 运行 在代理上运行,但设置失败并出现类型错误: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]
。