使用Proxy与基元周围的包装器对象

时间:2018-03-05 17:47:30

标签: javascript primitive

我想使用javascript' Proxy个对象来增加数据结构,增加一些日志记录。在这样做时,我注意到了一个问题:

simpleProxy = new Proxy(new Number(4), {})
simpleProxy.valueOf(); // TypeError: valueOf method called on incompatible Proxy

错误对我有意义。调用valueOfthis对象设置为Proxy而不是Number对象,从而导致类型错误。

现在的问题是,在用户代码中,将Proxy作为this值传播到函数调用中实际上非常有用,以便通过代理完成对属性的访问。只有在打电话"低级"如上所述的例程我遇到了麻烦。问题:如何可靠地检测到我正在调用这样一个代理不兼容的函数,可能假设用户定义的函数可以安全地调用?

这不是询问被调用函数是否是本机函数。只有某些本机函数无法处理Proxy值。此外,链接问题中的检测相当不健全,这里需要不同的特殊情况。考虑从本机接口链接的函数。它很可能能够在代理值上运行,因此将其检测为本机函数将是误报。

目前,我认为最好的方法是首先通过调用target来查明get中的target.valueOf()是否是原始的,而不是根据函数是否为本机来推断。因此,这不是重复。

1 个答案:

答案 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() );