在Widget的类变量和构造函数中初始化数组之间的区别?

时间:2017-02-14 04:47:59

标签: javascript dojo widget

如果我在窗口小部件的类变量或其构造函数中初始化数组,会有区别吗?

要明确的是,这(宣言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= [];
            }
});

这也符合我的期望。关于我出错的地方或者我在这里不理解的是什么?

谢谢! :)

1 个答案:

答案 0 :(得分:3)

这种行为的原因是简单类型是按值分配的,而对象是通过引用分配的,在JavaScript数组中是对象(在您的情况下是ChannelFactory<T>)。

如果您的类包含数组或其他对象,则应在controls中声明它们,以便每个实例都有自己的副本。

字符串,数字,布尔值,null等简单类型可以直接在类中声明,因为简单类型是按值分配的。

示例:

constructor()