【问题标题】:Is it possible to Proxy primitives (strings, numbers)?是否可以代理原语(字符串、数字)?
【发布时间】:2021-11-10 15:53:42
【问题描述】:

我正在探索 JavaScript 中的代理,我想知道是否有任何方法可以使用 Proxy 原语。如果我尝试这样做:

new Proxy('I am a string');

它抛出Uncaught TypeError: `target` argument of Proxy must be an object, got the string "I am a string"


我想这样做的原因是能够代理原语的原型方法。我可以编辑原型,但编辑每个基元的每个原型函数听起来并不可行。

【问题讨论】:

  • 正如消息所说,它需要一个对象,而不是原语。你可能会做new Proxy(new String("I am a string"))。但是,我怀疑可能是an XY problem。你到底想做什么需要代理方法?
  • @VLAZ 就像我提到的那样,我只是在试验代理,并试图了解更多关于它的信息。没有目的。
  • 在这种情况下,错误消息似乎包含了您想要的所有信息。
  • @VLAZ 当然,我只是在这里寻找聪明人的任何技巧:)

标签: javascript primitive javascript-proxy


【解决方案1】:

您可以通过将原始值包装在一个对象中来解决它:

const proxy = new Proxy({ value: 'I am a string' }, {
  get(target, prop, receiver) {
    const prim = Reflect.get(target, 'value');
    const value = prim[prop];
    return typeof value === 'function' ? value.bind(prim) : value;
  }
});

proxy.endsWith('ing');
// => true

proxy.valueOf();
// => 'I am a string'

'test ' + proxy;
// => 'test I am a string'

proxy[0];
// => 'I'

【讨论】:

    猜你喜欢
    • 2021-09-20
    • 2021-01-06
    • 1970-01-01
    • 2019-02-02
    • 1970-01-01
    • 2012-08-09
    • 1970-01-01
    • 2019-03-23
    • 1970-01-01
    相关资源
    最近更新 更多