Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
203
Добавлен:
10.05.2015
Размер:
4.05 Mб
Скачать

13.2.1.3. Ext.Extend и соглашения о параметрах конструкторов

Синтаксис:

Ext.extend( Function superclass, Object overrides ) : Function

или

Ext.extend( Function subclass, Function superclass, [Object overrides] ) : Function

Рассмотренный ранее метод Ext.override выполняет замену реализации на новый метод целиком, а Ext.extend позволяет осуществить полноценное наследование согласно парадигме ООП. Имеются два варианта вызова этого метода, каждый из которых возвращает определение нового класса, содержащего объекты, унаследованные от родительского, определенного в параметре superclass, и перекрывает методы, заданные в параметре overrides. Также он добавляет к новому классу служебный метод override(), который дает возможность перекрывать методы экземпляра класса, и такое же служебное свойство superclass, позволяющее получить доступ к родительскому объекту.

Библиотека ExtJS имеет ряд соглашений о стиле кодирования, которые позволяют улучшить поддержку и читаемость написанного кода. Одно из них: соглашение о виде конструкторов классов. Практически все конструкторы ExtJS принимают единственный параметр, являющийся объектом нотации в формате JSON и содержащий конфигурацию того или иного компонента. Для приверженцев традиционных объектно-ориентированных языков программирования на первый взгляд это может показаться диким, так как обычно сигнатуры методов (включая конструкторы классов) ожидают явно заданные параметры с жестко определенным типом. Но из-за того, что JavaScript динамически типизированный язык, создавать таким образом объекты с помощью классов не всегда удобно.

Ниже приведен пример использования Ext.extend. Обратите внимание, что имеются два способа наследования. Первый:

var newClass = Ext.extend(Ext.form.ComboBox, {

constructor: function(config) { // явное задание конструктора

config.emptyText = "'5' не допускается";

newClass.superclass.constructor.call(this, config);

},

setValue: function(v) {

if (v == 5) { // если v равно 5, сообщить пользователю

alert("'5' не допускается");

} else { // иначе вызываем метод родителя

newClass.superclass.setValue.call(this, v);

}

}

});

Второй:

function newClass(config) { // конструктор

config.emptyText = "'5' не допускается";

newClass.superclass.constructor.call(this, config);

};

Ext.extend(newClass, Ext.form.ComboBox, {

setValue: function(v) {

if (v == 5) { // если v равно 5, сообщить пользователю

alert("'5' не допускается");

} else { // иначе вызываем метод родителя

newClass.superclass.setValue.call(this, v);

}

}

});

Так как все объекты ExtJS имеют одну и ту же форму указания параметров в конструкторе, это позволяет работать с ними без особых усилий: достаточно скопировать все значения объекта config. ExtJS имеет два встроенных метода для выполнения этих действий, которые далее будут рассмотрены.

13.2.1.4. Ext.Apply

Синтаксис:

Ext.apply( Object obj, Object config, [Object defaults] ) : Object

Метод Ext.apply производит копирование каждого члена объекта config в объект obj. Опционально может быть задан параметр defaults, содержимое которого также копируется в объект obj, но перед выполнением копирования объекта config.