ExtJS的继承行为(ExtJs inheritance behaviour)

2019-09-21 05:15发布

是否有人可以解释这种行为给我。 让我们声明一个类:

Ext.define('baseClass',{
    a:null,
    ar:[],

    add:function(v) {
        this.ar.push(v);
    },
    sayAr:function() {
        console.log(this.ar);
    },

    setA:function(v) {
        this.a= v;
    },
    sayA:function() {
        console.log(this.a);
    }
});

现在,我创建了两个对象

var a = Ext.create('baseClass');
var b = Ext.create('baseClass');

测试属性

a.setA(1);
b.setA(2);

a.sayA();
b.sayA();

该输出

1
2

一切都是美好的,但

a.add(1);
b.add(2);

a.sayAr();
b.sayAr();

我们得到

[1,2]
[1,2]

这个我不明白。 为什么它使用单独的“一”的属性,但一个“AR”阵列的两个对象。 “AR”未声明为静态! 我不明白这一点的。

Answer 1:

当你把东西在类的声明,这意味着它被压入对象原型(读:它得到跨所有实例共享)。 它不是一个真正的问题字符串/数字/布尔变量,但对于对象和数组,你会看到此行为进来的效果。

如果你想有每个实例的数组/对象,那么你需要的情况下明确添加:

Ext.define('baseClass',{
    a:null,

    constructor: function(){
        this.ar = [];
    }

    add:function(v) {
        this.ar.push(v);
    },
    sayAr:function() {
        console.log(this.ar);
    },

    setA:function(v) {
        this.a= v;
    },
    sayA:function() {
        console.log(this.a);
    }
});


Answer 2:

这是因为该位在这里:

Ext.define('baseClass',{
   a:null,
   ar:[], <--------------------------- you're instantiating an array object!

为了使其更清晰,上面的代码就相当于:

Ext.define('baseClass',{
   a:null,
   ar:new Array(),

因此,这两个对象共享相同的阵列,因为对象的构造函数仅复制参考阵列不是整个数组对象。

不知道Ext.js如何处理构造函数/初始化,但你需要创建不是你把它声明的对象施工过程中数组....

OK,谷歌搜索给了我这样的:

Ext.define('baseClass',{
    constructor: function () {
        this.ar = [];
    },

这应该解决您的问题。



文章来源: ExtJs inheritance behaviour