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]