我正在使用 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
get
上应用window.location
代理?答案 0 :(得分:2)
为什么会抛出错误?
出于同样的原因why proxies are incompatible with Set
s或with Map
s:它们是本机对象,并且它们的方法(例如示例中的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
全局。它是一个不可配置的属性,分配给它将导致导航无法写入属性。