我目前经常使用代理,但有一个陷阱,我不知道如何解决而不感到 hackish。
看这个简单的代码:
var target = {bla: 4}
var handler = {
get: function (target, name, receiver) {
console.log(target, name)
}
}
var p = new Proxy(target, handler)
console.log('Finished', p)
这输出:
{ bla: 4 } Symbol(util.inspect.custom)
{ bla: 4 } 'inspect'
{ bla: 4 } 'inspect'
{ bla: 4 } Symbol(Symbol.toStringTag)
{ bla: 4 } Symbol(Symbol.iterator)
Finished: { bla: 4 }
在我的真实代码中,我可以毫无问题地整理符号,Symbol(util.inspect.custom)
因为我可以将它们中继到Reflect.get
. 但是,getTrap 也使用 调用'inspect'
。两次!target.inspect
那是一个字符串——这个“特殊”调用和对属性的正常访问没有区别。
我该如何解决这种歧义?为什么无论如何都要用非符号名称调用陷阱?