2017-02-14 12 views
1

ウィジェットのクラス変数またはそのコンストラクタで配列を初期化すると違いはありますか?ウィジェットのクラス変数とコンストラクタの配列の初期化の違いは?

define([ 
     "dojo/_base/declare" // 
     , "dijit/_WidgetBase" // 
     , "dojox/dtl/_Templated" 
     , 'dojo/domReady!' 
     ], function(declare, WidgetBase, Templated){ 
    return declare([WidgetBase, Templated], { 
      controls: [], 
      constructor: function(params, srcNodeRef){ 
       this.inherited(arguments); 
      } 
}); 

この(宣言2):

明確にするため、この差(宣言1)が何である

define([ 
     "dojo/_base/declare" // 
     , "dijit/_WidgetBase" // 
     , "dojox/dtl/_Templated" 
     , 'dojo/domReady!' 
     ], function(declare, WidgetBase, Templated){ 
    return declare([WidgetBase, Templated], { 
      constructor: function(params, srcNodeRef){ 
       this.inherited(arguments); 
       this.controls= []; 
      } 
}); 

これらの宣言の違いは、属性controlsであります。宣言1では、クラスメンバー変数として初期化されます。宣言2では、それはコンストラクタで初期化され、クラスはそれを参照します。

私が気づいたことは、宣言1を使用すると、widget.controls配列がウィジェットの異なるインスタンス間で共有されることです。私たちが宣言1を使用して行う場合は、明確にするために:

var widget1= new Widget(); 
var widget2= new Widget(); 

そして、widget1.controlswidget2.controlsと同じ配列を指します。これは宣言2の場合ではありません。宣言1と宣言2の組み合わせを使用する場合、つまり、controls: nullをクラスメンバー変数に置き換えて、コンストラクタにthis.controls= []を初期化する場合もそうではありません。したがって、宣言3は次のようになります。

define([ 
     "dojo/_base/declare" // 
     , "dijit/_WidgetBase" // 
     , "dojox/dtl/_Templated" 
     , 'dojo/domReady!' 
     ], function(declare, WidgetBase, Templated){ 
    return declare([WidgetBase, Templated], { 
      controls: null, 
      constructor: function(params, srcNodeRef){ 
       this.inherited(arguments); 
       this.controls= []; 
      } 
}); 

これは私の期待通りに動作します。私がどこに間違っているのか、私はここで理解していないのですか?

ありがとうございました! :)

答えて

3

単純な型は値で割り当てられますが、オブジェクトは参照によって割り当てられ、JavaScript配列ではオブジェクトが(あなたの場合はcontrols)です。

クラスに配列やその他のオブジェクトが含まれている場合は、constructor()で宣言して、各インスタンスが独自のコピーを取得するようにする必要があります。

シンプルな型が値によって割り当てられるため、文字列、数値、ブール値、nullなどの単純型をクラスで直接宣言できます。

例:

define(["dojo/_base/declare", "my/Foo"], function(declare, Foo){ 
    return declare(null, { 
    arr: [ 1, 2, 3, 4 ], // object. shared by all instances! 
    num: 5,    // simple type value non-object. not shared. 
    str: "string",  // simple type value non-object. not shared. 
    obj: new Foo(),  // object. shared by all instances! 

    constructor: function(){ 
     this.arr = [ 1, 2, 3, 4 ]; // per-instance object. 
     this.obj = new Foo();  // per-instance object. 
    } 
    }); 
}); 
+0

これはDOJOの問題が、JSの問題ではありませんか? – Himanshu

+0

@HimanshuこれはJavaScriptがどのように設計されており、問題ではないかということです:) – GibboK

+1

よく説明されている@GibboK、:) –

関連する問題