我正在使用Chrome 60。我刚刚尝试在 上应用get 代理window.location。
它适用于前两个参考,但是,随后失败并出现Illegal invocation错误:
location = new Proxy(location, {\n get: (target, name) => {\n console.log(name, target, "PROX");\n return target[name];\n }\n});\nRun Code Online (Sandbox Code Playgroud)\n错误消息是:
\n\n\nVM3495:3 符号(Symbol.toPrimitive) 位置 {\xe2\x80\xa6} "PROX"
\nVM3495:3 toString 位置 {\xe2\x80\xa6} PROX
\n未捕获的类型错误:非法调用:1:10
\n
get代理window.location?为什么它会抛出错误?
代理与Sets或sMap不兼容的原因相同:它们是本机对象,并且它们的方法(如您toString的示例中所示)期望在具有相应内部插槽的本机对象上调用,而不是代理。
如何
window.location在 Javascript 中应用 get Proxy on?
您需要将陷阱get拦截的所有方法绑定到目标:
new Proxy(location, {
get: (target, name) => {
console.log(name, target, "PROX");
return typeof target[name] == "function"
? target[name].bind(target)
: target[name];
}
});
Run Code Online (Sandbox Code Playgroud)
然而,这仍然没有改变你不能用window.location你自己的实现替换全局。它是一个不可配置的属性,分配给它会导致导航不写入该属性。
| 归档时间: |
|
| 查看次数: |
4213 次 |
| 最近记录: |