如何在Javascript中的`window.location`上应用`get` Proxy?

时间:2017-08-30 16:52:47

标签: javascript

我正在使用 Chrome 60 。我刚刚尝试在get上应用window.location 代理

它适用于前两个引用,然后失败并出现Illegal invocation错误:

location = new Proxy(location, {
    get: (target, name) => {
        console.log(name, target, "PROX");
        return target[name];
    }
});

错误消息是:

  

VM3495:3符号(Symbol.toPrimitive)位置{...}“PROX”

     

VM3495:3 toString Location {...} PROX

     

未捕获的TypeError:非法调用:1:10

  1. 为什么会抛出错误?
  2. 如何在Javascript中get上应用window.location代理?

1 个答案:

答案 0 :(得分:2)

  

为什么会抛出错误?

出于同样的原因why proxies are incompatible with Setswith Maps:它们是本机对象,并且它们的方法(例如示例中的toString)期望被调用具有相应内部插槽的本机对象,而不是代理。

  

如何在Javascript中的window.location上应用get Proxy?

您需要绑定get陷阱拦截到目标的所有方法:

new Proxy(location, {
    get: (target, name) => {
        console.log(name, target, "PROX");
        return typeof target[name] == "function"
          ? target[name].bind(target)
          : target[name];
    }
});

但是,仍然没有改变,您无法用自己的实现替换window.location全局。它是一个不可配置的属性,分配给它将导致导航无法写入属性。