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

3 つ目は、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 に答える