在揭示模块模式时,你能公开一个哈希属性吗?

时间:2013-11-10 08:36:28

标签: javascript

所以我有一个标准的揭示模块模式,而不是公开所有我的配置设置,我只想公开这些配置的一个较小的子集。如果有一种解决方法或我遗漏的东西,它就无法工作和好奇。

   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
       }

3 个答案:

答案 0 :(得分:2)

这样的事情:

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

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

<强>解释

这是你的问题。首先,您的代码中存在语法错误。您在commaconfig.someValue: someValue之后错过config[someValue] : someValue

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

第三件事是我认为你对javascript对象和揭示模块设计模式的工作方式有一些误解。当您编写return部分时,您不需要使用属性名称将它们公开给公众。例如,你可以写whateverFunc: func1,它会完美地运作。您要尝试执行的操作是使用config.someValueconfig[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

DEMO:http://jsbin.com/iJEZaBu/1/edit

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

}

这样,您实际上将闭包配置的选定属性复制到返回对象中的其他配置。