所以我有一个标准的揭示模块模式,而不是公开所有我的配置设置,我只想公开这些配置的一个较小的子集。如果有一种解决方法或我遗漏的东西,它就无法工作和好奇。
var rmp = function(){
var config = {
someValue = "I like p&j sandwiches",
anotherVal = {
a: 'somevalue'
}
}
var func1 = function(){
// do some stuff
}
return {
func1: func1,
config.someValue: someValue // <-- doesn't work
config[someValue] : someValue // <-- doesn't work
config : config // <-- works
}
}
似乎不允许散列的属性作为独立的可用。 当然,现在,如果我创建一个只返回该值的函数,那么它是有效的。但我不想为此创建另一个函数。
var showme = function(){
return config.someValue;
}
return {
func1: func1,
showme: showme
}
答案 0 :(得分:2)
这样的事情:
return {
func1: func1,
someValue: config.someValue
}
现在,除了config
属性外,您的someValue
对象不会向公众公开。
<强>解释强>
这是你的问题。首先,您的代码中存在语法错误。您在comma
和config.someValue: someValue
之后错过config[someValue] : someValue
。
其次,例如在config.someValue: someValue
中您指的是someValue
- 在右侧 - 您的脚本中未定义。正确的方法是config.someValue
而不是someValue
。
第三件事是我认为你对javascript对象和揭示模块设计模式的工作方式有一些误解。当您编写return
部分时,您不需要使用属性名称将它们公开给公众。例如,你可以写whateverFunc: func1
,它会完美地运作。您要尝试执行的操作是使用config.someValue
和config[someValue]
,这可能有效,但与您的实际config
对象没有任何关系/访问权限。
为了更清楚地设想以下return
对象:
return {
doSomething: func1,
doAnotherThing: function () {
return config.someValue;
},
getSomeValue: config.anotherVal
}
因此,您可以看到对象属性 - 左侧 - 只是一个名称,用于显示分配给它们的值 - 右侧。
答案 1 :(得分:1)
您不能将某个对象的某些属性设为私有,而将某些属性设置为public。但是,您可以定义一个新对象,该对象公开您想要公开的属性并返回该属性。为了获得最佳效果,公共对象的属性将更改实际的配置对象,如下例所示:
var rmp = function(){
var config = {
someValue : "I like p&j sandwiches",
anotherVal : {
a: 'somevalue'
}
};
var publicConfig = Object.create(null, {
someValue : {
set : function(val) { config.someValue = val; },
get : function() { return config.someValue; }
}
});
var func1 = function(){
console.log(config.someValue);
};
return {
func1: func1,
config: publicConfig
};
};
var r = new rmp();
r.func1(); // I like p&j sandwiches
r.config.someValue = 'Changed';
r.func1(); // Changed
答案 2 :(得分:0)
您无法像这样设置配置的子属性。这应该适合你
var rmp = function(){
var config = {
someValue = "I like p&j sandwiches",
anotherVal = {
a: 'somevalue'
}
}
var func1 = function(){
// do some stuff
}
return {
func1: func1,
config: { someValue: config.someValue},
}
}
这样,您实际上将闭包配置的选定属性复制到返回对象中的其他配置。