#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'