我想使用javascript' Proxy
个对象来增加数据结构,增加一些日志记录。在这样做时,我注意到了一个问题:
simpleProxy = new Proxy(new Number(4), {})
simpleProxy.valueOf(); // TypeError: valueOf method called on incompatible Proxy
错误对我有意义。调用valueOf
时this
对象设置为Proxy
而不是Number
对象,从而导致类型错误。
现在的问题是,在用户代码中,将Proxy
作为this
值传播到函数调用中实际上非常有用,以便通过代理完成对属性的访问。只有在打电话"低级"如上所述的例程我遇到了麻烦。问题:如何可靠地检测到我正在调用这样一个代理不兼容的函数,可能假设用户定义的函数可以安全地调用?
这不是询问被调用函数是否是本机函数。只有某些本机函数无法处理Proxy
值。此外,链接问题中的检测相当不健全,这里需要不同的特殊情况。考虑从本机接口链接的函数。它很可能能够在代理值上运行,因此将其检测为本机函数将是误报。
目前,我认为最好的方法是首先通过调用target
来查明get
中的target.valueOf()
是否是原始的,而不是根据函数是否为本机来推断。因此,这不是重复。
答案 0 :(得分:0)
首先我们检查属性是来自原型还是来自目标本身,如果没有并且关键是方法,我们返回一个匿名函数,将其参数传递给具有相应this
的方法什么时候叫。
注意:我不完全确定这是否万无一失。
let a = new Proxy(new Number(3), {
get(target, key) {
if (!target.hasOwnProperty(key) && typeof target[key] === "function") {
return function(...args) {
return target[key].call(target, args);
}
}
return target[key];
}
});
console.log( a.valueOf() );