3

dojo で実際のプライベート変数を定義する良い方法はありますか?

dojo 1.7/1.8 では、private 変数を定義する 2 つの方法を見つけましたが、どちらも static private (クラスのすべてのインスタンスで共有) です。

1.匿名の即時関数を使用します。

define([
'dojo/_base/declare'], function(declare) {  
'use strict';    

return declare('test.Class2', null, (function(){
    var a = 1;
    return {
        constructor: function(){
            console.log('constructor');
        },
        geta: function(){
            return a;
        },
        seta: function(v){
            a = v;
        }
    };
})());

});

2.モジュール定義でプライベート変数を定義します。

define([
'dojo/_base/declare'], function(declare) {  
'use strict';    
var a = 1;
return declare('test.Class1', null, {
    constructor: function(){
        console.log('constructor');
    },
    geta: function(){
        return a;
    },
    seta: function(v){
        a = v;
    }
});

});

4

4 に答える 4

3

質問を正しく理解していると仮定すると、良い方法はないと思います。

Dojo Style Guidによると、プライベート変数とメソッドは前にアンダースコアを付けてマークする必要があります (例: _myPrivatePropertyまたは_myPrivateMethod() )。ただし、これは慣例であり、非公開にするものではありません。クラス外からもアクセスできます。

すでに述べたように、プライベート静的変数を作成できます。もう 1 つの方法は、クラス メソッド内に変数を作成することです。これらは、中括弧のスコープ内でのみ表示されます ( Paul Kunzeの回答で既に提案されているように)。次に、それらを関数パラメーターでクラスに渡すことができます。しかし、それはあなたが探しているものではないと思います。

静的オブジェクトと、各クラス インスタンスが独自のオブジェクト プロパティにアクセスすることで、巧妙なことを実行できる可能性があります。ただし、これは珍しいことでも複雑なことでもありません。アンダースコア付きプロパティを使用して、プライベートと見なす変数をマークするという標準に固執することをお勧めします。

于 2012-11-06T15:37:40.887 に答える
0

プライベート変数を含めることができます...しかし、すべてがコンストラクター内にある必要があります。

[...]
return declare('test.Class1', null, {
   constructor: function(){
      console.log('constructor');
      var privVar1 = 'foo';  // this is how its normally done in JavaScript

      this.modPrivVar1 = function(){
         privVar1 = 'bar';
      }
   },
});

このアプローチの欠点は、「declare」関数の値を dojo ローダーの使用に制限する継承を明示的に実行する必要があることです。

于 2014-06-10T22:41:12.257 に答える
0

コンストラクター内で必要なプライベート メンバーを宣言するのはどうですか?

    [...]
    return declare('test.Class1', null, {
       constructor: function(){
          console.log('constructor');
          var = privVar1 = 'foo';  // this is how its normally done in JavaScript
       },

       [..]

       //so called privileged Method is "public" but can access the "private var"
       modPrivVar1: function(){
          privVar1 = 'bar';
       }
    });

Dojo を使用してクラスを定義していないため、これが機能するかどうかはわかりません。それがうまくいったかどうか教えてください。

于 2012-11-06T09:41:19.820 に答える