Я хотел бы создать прокси-объект, который перехватывает все извлечения свойств и вызовы функций и возвращает undefined.
Выполнить первое тривиально:
const proxy = new Proxy({}, { get: () => undefined });
proxy.foo // undefined
На самом деле мне для этого даже не нужен прокси, пустой объект ({}) сделает то же самое. Однако если сделать то же самое для вызовов функций, возникает ошибка:
proxy.foo() // TypeError: proxy.foo is not a function
Я мог бы заставить ловушку get вернуть функцию:
const proxy = new Proxy({}, { get: () => () => undefined });
proxy.foo() // undefined
proxy.foo // [Function]
Но, как вы можете видеть, он вернет функцию вместо undefined для моего исходного случая доступа к свойствам. Возможно ли добиться того, что я хочу?
const proxy = ???;
proxy.foo; // undefined
proxy.foo(); // undefined
Конечная цель - использовать это как «заглушку» для тестирования.
Обновлено: Спасибо @Bergi за его ответ. Следующий код выполняет то, что я хочу:
const proxy = new Proxy(new Function, {
get: (target, prop, receiver) => receiver,
});
console.info('proxy.foo', proxy.foo); // undefined
console.info('proxy.foo()', proxy.foo()); // undefined
console.info('proxy.foo.bar', proxy.foo.bar); // undefined
console.info('proxy.foo.bar()', proxy.foo.bar()); // undefined



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Нет, это невозможно. Прокси-сервер не перехватывает вызовы метод, он может только перехватывать вызовы самого прокси (как в proxy()). Вызов метода - это просто доступ к свойству, за которым следует вызов функции для значения свойства. И невозможно иметь значение, которое одновременно является undefined и функцией.
Чтобы иметь действительно универсальную заглушку для тестирования, ваш прокси должен возвращать себя (или, лучше, другой прокси) для любого доступа или вызова, чтобы вы могли иметь произвольные цепочки.
Вы можете сделать это только для того, чтобы достичь того, чего хотите.
var obj = {
foo: 1,
bar: 2,
fooFunc: () => {
return "this is fooFunc";
},
barFunc: () => {
return "this is barFunc";
}
}
let Proxy = function (object) {
for(var prop in object) {
if (typeof object[prop] === 'function') {
this[prop] = () => {
return undefined;
}
}
else {
this[prop] = undefined;
}
}
}
let proxy = new Proxy(obj);
console.info(obj.foo);
console.info(proxy.foo);
console.info(obj.fooFunc());
console.info(proxy.fooFunc());
Это не идеально для настройки подходов к заглушке, но я полагаю, что это работает для вашего случая.