В ExtJS объединить объекты

у меня есть супер класс в моем приложении, который определяет такой объект:

Ext.define('superclass', {
    myObject: {
        prop1: true,
        prop2: 200,
        ..
    }

и дочерний класс, унаследовавший суперкласс выше, который объявляет тот же объект:

Ext.define('childclass', {
    extend: 'superclass',

    myObject: {
        prop3: false,
        prop4: false,
        ..
    }

проблема в том, что myObject в дочернем классе имеет только свойства prop3 и prop4.

мне нужно, чтобы дочерний класс myObject ib имел все свойства prop1, prop2, prop3 и prop4.

Как я могу это сделать ?

3 ответов


расширьте объект в конструкторе (или в initComponent, если вы расширяете Ext.Компонент):

Ext.define('childclass', {
    extend: 'superclass',

    constructor: function() {
        this.myObject = Ext.apply({}, this.myObject, {
            prop3: false,
            prop4: false
        });
        this.callParent(arguments);
    }
});

демо.


оба предоставленных ответа изменят свойство MyObject прототипа суперкласса, как только будет построен дочерний класс. Это может быть не то, чего ты хочешь. Я спрашиваю, почему вы помещаете объект в прототип класса, как это. Обычно это не очень хорошая идея. Но если вы действительно хотите, вы можете сделать это

Ext.define('childclass', {
    extend: 'superclass',

    // I'm adding an empty object here so that myObject on the
    // prototype does not get overridden.
    myObject: Ext.merge({}, superclass.prototype.myObject, {
        prop3: false,
        prop4: false
    });

});

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

допустим, у вас есть это в вашем первом конфиге:

myObject: {
   prop1: false,
   person: {
       name: "John"
   }
}

и ваш второй объект

myObject: {
   prop2: false,
   person: {
       surname: "Doe"
   }
}

ваша заявка будет перезаписывать человека, и у вас будет только person.surname.

В что-то вроде этого:

myObject: {
   prop1: false,
   prop2: false,
   person: {
       surname: "Doe"
   }
}

Merge объединит два объекта.

Ext.define('childclass', {
    extend: 'superclass',

    constructor: function() {
        this.myObject = Ext.merge(this.myObject, {
            prop3: false,
            prop4: false
        });
        this.callParent(arguments);
    }
});

обратите внимание, что это будет необходимо только в месте, как описано в моем например, если нет, вы можете использовать ответ Molecular.