В ExtJS callParent() по сравнению с initConfig по сравнению с суперклассом

В чем разница между этими фрагментами?:

constructor: function(config) {
    this.initConfig(config);
}

constructor: function(config) {
    this.callParent(arguments);
}

constructor: function(config) {
    this.superclass.constructor.call(this, config);
}

И как он отличается от переопределения ДРУГИХ методов, чем constructor?

Ответы

Ответ 1

Второй и третий фрагменты функционально эквивалентны. callParent - это просто более простой и простой способ вызвать родительскую функцию вместо перехода через свойство superclass.

Первый пример совершенно другой. Во-первых, он не вызывает родительский конструктор. Это, как правило, плохая новость. Базовый класс обычно имеет некоторую инициализацию, которую нужно выполнить, и забыть вызвать родителя для конструктора (и initComponent) является общим источником ошибок.

initConfig - метод удобства, который будет:

  • объединить исходную конфигурацию вашего объекта с конфигурацией, которая передается в
  • создать getters и seters для всех свойств в config
  • применить конфигурацию к объекту

Это полностью отличается от вызова родительского конструктора. То, что вызывает родительский конструктор, полностью зависит от того, что он написал. Некоторые будут использовать initConfig, некоторые не будут, а другие будут делать то же, что и initConfig, но вручную.

Не нужно использовать initConfig, и это даже опасно время от времени. Но эта другая история вообще (для Ext 4.1, initConfig выглядит надежно безвредным и не содержит тех же опасных побочных эффектов, что и в 4.0)

Боковое примечание

Просто чтобы указать. Во втором и третьем фрагментах конструктор не нужен. Если ваш конструктор вызывает только родительский конструктор, вы можете полностью оставить свой конструктор.