15

これは MDC で見つかりましたが、プライベート変数を

var dataset = {
    tables:{
        customers:{
            cols:[ /*here*/ ],
            rows:[ /*here*/ ]
        },
        orders:{
            cols:[ /*here*/ ],
            rows:[ /*here*/ ]
        }
    },
    relations:{
        0:{
            parent:'customers', 
            child:'orders', 
            keyparent:'custid', 
            keychild:'orderid',
            onetomany:true
        }
    }
}

Javascript で OOP を理解する方法では、dataset.tables.customers.cols[0] にそのようなアイテムが存在する場合にアクセスできます。
しかし、プライベート変数を顧客に配置したい場合、それはどのようになるでしょうか?
追加var index = 0;すると実行時エラーが発生します。

4

3 に答える 3

27

関数が関与しないと、「プライベート」変数を持つことはできません。関数は、JavaScript で新しいスコープを導入する唯一の方法です。

しかし、恐れることはありません。適切な場所に関数を追加して、オブジェクトでこの種の機能を得ることができます

var dataset = {
  tables: {
    customers:(function(){
      var privateVar = 'foo';
      return { 
        cols:[ /*here*/ ],
        rows:[ /*here*/ ]
      }
    }()),
    orders:{
      cols:[ /*here*/ ],
      rows:[ /*here*/ ]
    }
  },
  relations: [{
    parent:'customers', 
    child:'orders', 
    keyparent:'custid', 
    keychild:'orderid',
    onetomany:true
  }]
};

しかし、これは私たちに多くの利益をもたらしません。これはまだほとんどが単なるリテラル オブジェクトの集まりです。これらのタイプの「プライベート」変数にはメソッドがないため、意味がありません。関数 (クロージャー) を追加して作成したスコープ内の変数を実際に読み取ったり、使用したりするものはありません。

しかし、メソッドがあれば、実際に役立つようになるかもしれません。

var dataset = {
  tables: {
    customers:(function(){
      var privateVar = 'foo';
      return { 
        cols:[ /*here*/ ],
        rows:[ /*here*/ ],
        getPrivateVar: function()
        {
          return privateVar;
        }
      };
    }()),
    orders:{
      cols:[ /*here*/ ],
      rows:[ /*here*/ ]
    }
  },
  relations: [{
    parent:'customers', 
    child:'orders', 
    keyparent:'custid', 
    keychild:'orderid',
    onetomany:true
  }]
};

alert( dataset.tables.customers.getPrivateVar() );
于 2009-09-08T21:22:33.047 に答える
10

JavaScript には、厳格な言語に見られるようなアクセス制御がありません。クロージャを使用してオブジェクトのデータへのプライベート アクセスをシミュレートできますが、例はオブジェクト リテラル (単純なデータ構造) であり、構築されたオブジェクトではありません。

むしろ、オブジェクトで何をしたいかによって異なります。「プライベート」メンバーの通常の手法は、メンバー関数からのみアクセスできることを意味し、コンストラクターを使用してオブジェクトを作成する必要があります。リテラル構文は、パブリック データと関数を含むデータ構造または軽量オブジェクトに使用されます。

プライベート クロージャー パターンを使用する際の問題は、リテラル内のフィールドがパブリック スコープ内にあることですが、変数が関数で定義されているため、クロージャーによってプライバシーが確保されるため、スコープがローカルに設定されます。リテラルを複製してプライベート フィールドを追加する関数を作成するか、プライベート データを持つパブリック フィールドを追加することができます。クロージャーをメンバーとして追加することもできるので、オブジェクト プライベートではなくメソッド プライベートであるプライベート フィールドを作成します。

dataset = {
    secretCounter: ( 
      function () {
      var c = 0;
      return function () { return ++c; }
    })(),      
   ...

したがって、その関数のみにプライベートなdataset.secretCounter()変数があります。c

于 2009-09-08T21:01:39.723 に答える
4

JavaScript のプライベート変数は、クロージャー内で var キーワードを使用して実行されます。特権のあるメソッドと属性のみがアクセスできます。これを行う方法は次のとおりです。

function dataset()
{
var private_stuff = 10; // private
this.foo = new function() { alert(private_stuff); } // priviliged
return {
    tables:{
        customers:{
                cols:[  ],
                rows:[  ]
        },
        orders:{
                cols:[  ],
                rows:[  ]
        }
    },
    relations:{
        0:{
                parent:'customers', 
                child:'orders', 
                keyparent:'custid', 
                keychild:'orderid',
                onetomany:true
        }
    }
}; // public
}

var d = new dataset;
alert(d.foo());
于 2009-09-08T21:26:29.487 に答える