Как создать прокси для всех объектов?

Я хотел бы создать прокси-объект, который перехватывает все извлечения свойств и вызовы функций и возвращает 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
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
212
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Нет, это невозможно. Прокси-сервер не перехватывает вызовы метод, он может только перехватывать вызовы самого прокси (как в 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());

Это не идеально для настройки подходов к заглушке, но я полагаю, что это работает для вашего случая.

Другие вопросы по теме