Поведение наследования 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:function() {
        console.log(this.a);
    }
});

теперь я создаю два объекта

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

2 ответов


когда вы помещаете что-то в объявление класса, это означает, что оно выталкивается на прототип объекта (читай: он получает общий доступ ко всем экземплярам). Это не проблема для строк/чисел / булов, но для объектов и массивов вы увидите, что это поведение вступает в силу.

Если вы хотите иметь массив / объект на экземпляр, то вам нужно явно добавить его в экземпляр:

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.define('baseClass',{
   a:null,
   ar:new Array(),

таким образом, оба объекта имеют один и тот же массив, потому что конструктор объекта копирует только ссылку на массив, а не полный объект массива.

не уверен, как Ext.js обрабатывает конструкторы / инициализаторы, но вам нужно создать массив во время построения объекта, а не при его объявлении....

хорошо, гуглить дал мне это:

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

Это должно решить вашу проблему.