Javascript ExtJs继承行为

Javascript ExtJs继承行为,javascript,inheritance,extjs,Javascript,Inheritance,Extjs,有人能给我解释一下这种行为吗。 让我们声明一个类: 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:fu

有人能给我解释一下这种行为吗。 让我们声明一个类:

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]
这我不明白。为什么两个对象都使用单独的“a”属性,而使用一个“ar”数组。 “ar”未声明为静态!
我一点也不明白。

当您在类声明中放入某些内容时,这意味着它被推送到对象原型上(阅读:它在所有实例中共享)。对于字符串/数字/布尔来说,这并不是一个真正的问题,但是对于对象和数组,您将看到这种行为开始生效

如果希望每个实例都有一个数组/对象,则需要将其显式添加到实例中:

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);
    }
});

这是因为这里有一点:

Ext.define('baseClass',{
   a:null,
   ar:[], <--------------------------- you're instantiating an array object!
因此,两个对象共享同一个数组,因为对象构造函数只复制对数组的引用,而不是完整的数组对象

不确定Ext.js如何处理构造函数/初始值设定项,但您需要在对象构造期间创建数组,而不是在声明数组时

好吧,谷歌给了我这个:

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

这应该可以解决您的问题。

谢谢,您能澄清为什么它与字符串/数字/bool不同吗?它没有任何区别,只是数组/对象是“引用”类型。字符串/数字/bool是不可变的数据类型。操作该值的唯一方法是将新值重新分配给相关属性,在大多数情况下,该属性会将新值作为特定实例的成员应用(
this.a=“mystring”
)。原型(共享)将保持不变。
Ext.define('baseClass',{
    constructor: function () {
        this.ar = [];
    },