【问题标题】:Javascript proxy handle return statementJavascript 代理句柄返回语句
【发布时间】:2019-02-28 21:50:21
【问题描述】:

我正在使用代理来处理对象的创建,而不必声明对象的所有“父键”。

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;

这部分很好而且功能齐全,但我遇到的问题是,我经常忘记我需要返回目标对象而不是代理,这经常在我的代码中产生非常奇怪的行为。

据我所知,代理对象无法处理返回语句。所以我正试图找到一种方法来做到这一点。类似的东西:

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;

有没有办法做到这一点?

谢谢。

编辑

我正在使用它来覆盖从大型产品到客户规格的配置。所以我正在使用数百行配置。使用代理可以让我构建配置文件以供将来更清晰地阅读。它还允许我将原始配置文件中的配置组合在一起,以评论更改它们的原因,而无需上下滚动对象。

//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());

【问题讨论】:

  • 这是不可能的。但是你能解释为什么你需要目标对象吗?代理旨在隐藏差异。
  • @trincot 因为代理用于实例化将在函数结束时返回的对象中的值。该对象用于在 Jquery 的扩展函数的帮助下覆盖另一个对象。我这样做主要是出于懒惰和方便。我想在我的上下文中使用代理确实没有必要
  • 我不明白你在说什么,但听起来你的问题可以通过添加相应的代码来澄清,如果你返回代理会出现错误的行为。
  • 基本上我将配置从产品覆盖到客户的规格。为此,我使用了 JQuery 的扩展函数,它可能无法正确处理代理,或者可能是产品中的某个地方导致了问题。
  • Object.assign()替换$extend()

标签: javascript es6-proxy


【解决方案1】:

不,没有办法让代理在从函数返回时识别它。 (顺便说一句,它也是从你的 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;
}

【讨论】:

  • 做我想做的事情的好方法。不知道为什么我没想到谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-20
  • 1970-01-01
  • 2013-10-06
  • 2015-03-22
  • 2015-10-31
  • 2017-06-19
相关资源
最近更新 更多