1

所以我有一个标准的显示模块模式,而不是公开我所有的配置设置,我只想公开这些配置的一小部分。如果有解决方法或我遗漏的东西,它不起作用并且好奇。

   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
       }
4

3 回答 3

2

像这样的东西怎么样:

return {
       func1: func1,
       someValue: config.someValue
}

现在,您的config对象除了其someValue属性外,不会向公众公开。

解释

这是您的问题。首先,您的代码中有语法错误。您在和comma之后都缺少 a 。config.someValue: someValueconfig[someValue] : someValue

其次,例如在config.someValue: someValue您指的是someValue- 在右侧 - 在您的脚本中没有定义。正确的方法config.someValue并不someValue孤单。

第三件事是,我认为您对 javascript 对象和揭示模块设计模式的工作方式存在一些误解。当您编写该return部分时,您不需要使用属性名称将它们公开。例如,你可以写whateverFunc: func1,它会工作得很好。您正在尝试做的是使用例如config.someValueand ,它可以工作,但与您的实际对象config[someValue]没有任何关系/访问权限。config

为了更清楚地想象以下return对象:

return {
    doSomething: func1,
    doAnotherThing: function () {
        return config.someValue;
    },
    getSomeValue: config.anotherVal
}

因此,如您所见,对象属性 - 左侧 - 只是一个名称,用于显示分配给它们的值 - 右侧。

于 2013-11-10T09:11:43.820 回答
1

您不能将对象的某些属性设为私有,而将某些属性设为公开。但是,您可以做的是定义一个新对象,该对象公开您想要公开的属性并将其返回。为了获得最佳效果,公共对象的属性将更改实际的配置对象,如下例所示:

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

演示:http: //jsbin.com/iJEZaBu/1/edit

于 2013-11-10T09:06:15.247 回答
0

你不能像那样设置 config 的子属性。这应该适合你

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},
   }

}

这样,您可以有效地将闭包配置的选定属性复制到返回对象中的不同配置。

于 2013-12-31T14:10:20.220 回答