Можно ли использовать прокси-примитивы (строки, числа)?

#javascript #primitive #javascript-proxy

Вопрос:

Я изучаю прокси в 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"


Причина, по которой я хочу это сделать, заключается в том, чтобы иметь возможность использовать методы прототипа примитива. Я мог бы отредактировать прототип, но редактирование каждой отдельной функции прототипа каждого отдельного примитива кажется нецелесообразным.

Комментарии:

1. Как говорится в сообщении, он ожидает объект, а не примитив. Вы, наверное, могли бы это сделать new Proxy(new String("I am a string")) . Однако я подозреваю, что это может быть проблемой XY . Что именно вы хотите сделать, для чего требуется проксирование методов?

2. @VLAZ, как я уже упоминал, я просто экспериментирую с прокси-сервером и пытаюсь узнать о нем больше. В этом нет никакой цели.

3. В этом случае, похоже, что сообщение об ошибке содержит всю необходимую информацию.

4. @VLAZ определенно, я просто ищу какие-нибудь хаки от здешних умных людей 🙂

Ответ №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'