【发布时间】:2017-02-14 04:47:58
【问题描述】:
如果我在小部件的类变量中或在它的构造函数中初始化数组有区别吗?
要清楚,这(声明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= [];
}
});
这也符合我的预期。关于我哪里出错或我在这里不理解的任何想法?
谢谢! :)
【问题讨论】:
标签: javascript dojo widget