2013-03-18 4 views
8

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

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

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

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

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

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

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

Как это сделать?

ответ

5

Продлить объект в конструкторе (или в InitComponent, если вы расширяете Ext.Component):

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

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

Demo.

+0

Это (и решение Ext.merge) изменит «myObject» на прототипе суперкласса, что не похоже на желаемое поведение. – wantok

+0

@ ванток, вы правы. Обновлено. –

+1

Вы можете перевернуть аргументы и сделать this.myObject третьим (по умолчанию) аргументом Ext.apply. То, как теперь это пользовательские свойства дочернего класса, не сможет переопределить свойства суперкласса, поскольку свойства myObject будут применены поверх их дочерних. – wantok

0

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

Допустим, у вас есть это в первый конфигурации:

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

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

+0

Я столкнулся с проблемой с этим решением и Molecular Man. Похоже, что myObject сохраняет эти новые свойства даже для новых объектов-экземпляров (lest's, другой тип дочернего класса, получающего этот суперкласс). – Beetlejuice

3

Оба предоставленных ответа изменят свойство 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 
    }); 

}); 
+0

Это работает, но теперь мне нужно включить «require» в суперкласс в дочернем классе. Это верно ? – Beetlejuice

+0

В моем случае я использую Deftjs libs, где мне нужно объявить «элемент управления» в классе, элементы привязки. – Beetlejuice

+0

@paulo Вам необходимо будет потребовать суперкласс перед определением детского класса, который я думаю. В проекте, над которым я работаю, мы не используем Ext.Loader, и суперклас уже будет включен, поэтому я не рассматривал это. – wantok

Смежные вопросы