ウィジェットのクラス変数またはそのコンストラクタで配列を初期化すると違いはありますか?ウィジェットのクラス変数とコンストラクタの配列の初期化の違いは?
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.controls
はwidget2.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= [];
}
});
これは私の期待通りに動作します。私がどこに間違っているのか、私はここで理解していないのですか?
ありがとうございました! :)
これはDOJOの問題が、JSの問題ではありませんか? – Himanshu
@HimanshuこれはJavaScriptがどのように設計されており、問題ではないかということです:) – GibboK
よく説明されている@GibboK、:) –