Оператор возврата дескриптора прокси Javascript - PullRequest
0 голосов
/ 01 марта 2019

Я использую прокси для управления созданием объекта без необходимости объявлять весь «родительский ключ» объекта.

var target = {};
var config = Proxy_ObjectCreator(target, handlers);
config.foo.bar = "Didn't need to create foo !";
return target;

Вместо этого

var config = {
    foo : {
        bar : "needed to create foo ..."
    }
};
return config;

Эточасть хороша и функциональна, но проблема в том, что часто случается так, что я забываю, что мне нужно вернуть целевой объект вместо прокси-сервера, что часто создает действительно странное поведение в моем коде.

Насколько я знаю, у объекта Proxy нет способа обработать оператор return.И поэтому я пытаюсь найти способ сделать именно это.Что-то в этом роде:

var config = Proxy_ObjectCreator({}, {
    get: (obj, prop, receiver) => {
        //Do stuff ...
    },
    set: (obj, prop, receiver) => {
        //Do stuff ...
    },
    return: () => {
        return this.target;
    }
});
config.foo.bar = "Didn't need to create a target obj and don't need to return it !";
return config;

Есть ли способ достичь этого?

Спасибо.

Редактировать

I 'я использую это для переопределения конфигураций от большего продукта к спецификациям клиента.Так что я работаю с сотнями строк конфигураций.Использование прокси-сервера позволяет мне структурировать файл конфигурации для дальнейшего и более четкого чтения.Это также позволяет мне группировать конфигурации, которые могут быть по всему исходному файлу конфигурации, чтобы прокомментировать причину, по которой они были изменены, без необходимости прокручивать вверх и вниз объект.

//Normal Object Case
function getClientConfigs() = {
    return {
        config1: {
            foo: {
                bar: {
                    foofoo: {
                        barbar: "value to override"
                    }
                }
            }
        },
        // hundreds of other configs
        config2:{
           foo: "other value to override"
        }
    };
}

//With proxy
function getClientConfigs() = {
     var config = {};
     var proxy = Proxy_ObjectCreator(config, handlers);
     // Changing because client wanted that for x reason
     proxy.config1.foo.bar.foofoo.barbar = "value to override";
     proxy.config2.foo = "other value to override";
     return config;
}

$.extend(originalConfig, getClientConfigs());

1 Ответ

0 голосов
/ 01 марта 2019

Нет, прокси-сервер не может распознать его, когда он возвращается из функции.(Кстати, это также возвращается из вашей Proxy_ObjectCreator функции, так что вам придется явно игнорировать это…).Нет, это было бы слишком сложно.

Но вы могли бы использовать другой шаблон проектирования - не делайте Proxy_ObjectCreator фабричной функцией, вместо этого сделайте обратный вызов, чтобы прокси не мог (легко) выйти изконтекст:

function getClientConfigs() = {
     return withProxiedCreation({}, proxy => {
         proxy.config1.foo.bar.foofoo.barbar = "value to override";
         proxy.config2.foo = "other value to override";
     });
}

function withProxiedCreation(target, callback) {
    var proxy = new Proxy(target, handlers);
    callback(proxy);
    return target;
}
...