В 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.