Javascript 代理句柄 return 语句
Javascript proxy handle return statement
我正在使用代理来处理对象的创建,而无需声明对象的所有 "parent key"。
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;
那部分很好用,但我遇到的问题是我经常忘记我需要 return 目标对象而不是代理,这经常会产生非常奇怪的行为在我的代码中。
据我所知,代理对象无法处理 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;
有什么方法可以实现吗?
谢谢。
编辑
我正在使用它来覆盖从较大产品到客户规格的配置。所以我正在处理数百行配置。使用代理允许我构建配置文件以供将来更清晰地阅读。它还允许我将可以遍布原始配置文件的配置分组在一起,以评论它们被更改的原因,而无需上下滚动对象。
//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());
不,当代理从函数返回时无法识别它。 (顺便说一句,它也是从你的 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;
}
我正在使用代理来处理对象的创建,而无需声明对象的所有 "parent key"。
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;
那部分很好用,但我遇到的问题是我经常忘记我需要 return 目标对象而不是代理,这经常会产生非常奇怪的行为在我的代码中。
据我所知,代理对象无法处理 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;
有什么方法可以实现吗?
谢谢。
编辑
我正在使用它来覆盖从较大产品到客户规格的配置。所以我正在处理数百行配置。使用代理允许我构建配置文件以供将来更清晰地阅读。它还允许我将可以遍布原始配置文件的配置分组在一起,以评论它们被更改的原因,而无需上下滚动对象。
//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());
不,当代理从函数返回时无法识别它。 (顺便说一句,它也是从你的 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;
}