如果我在窗口小部件的类变量或其构造函数中初始化数组,会有区别吗?
要明确的是,这(宣言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):
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= [];
}
});
这也符合我的期望。关于我出错的地方或者我在这里不理解的是什么?
谢谢! :)
答案 0 :(得分:3)
这种行为的原因是简单类型是按值分配的,而对象是通过引用分配的,在JavaScript数组中是对象(在您的情况下是ChannelFactory<T>
)。
如果您的类包含数组或其他对象,则应在controls
中声明它们,以便每个实例都有自己的副本。
字符串,数字,布尔值,null等简单类型可以直接在类中声明,因为简单类型是按值分配的。
示例:
constructor()