Блок предоставляет функцию, реализующую механизмы для объявления и наследования классов.
| Способ | Сигнатура | Тип возвращаемого значения | Описание |
|---|---|---|---|
| Объявление базового класса | inherit(props {Object}, [staticProps {Object}]) |
Function |
Служит для создания (декларации), базового класса на основе свойств объекта. |
| Создание производного класса | inherit(BaseClass {Function}|{Array}, props {Object}, [staticProps {Object}]) |
Function |
Позволяет наследовать и доопределять свойства и методы базового класса. |
| Имя | Тип данных | Описание |
|---|---|---|
| __constructor | Function |
Функция, которая будет вызвана в ходе создании экземпляра класса. |
| Поле | Тип данных | Описание |
|---|---|---|
| __self | * |
Позволяет получить доступ к классу из его экземпляра. |
| __base | Function |
Позволяет внутри производного класса использовать методы базового (supercall). |
Блок реализован в технологиях:
vanilla.jsФункция inherit позволяет:
Блок является основой механизма наследования блоков в bem-core.
Функция полиморфна и, в зависимости от типа первого аргумента, может быть использована для:
Object – объявления базового класса.Function – создания производного класса на основе базового.Сигнатуры других аргументов функции зависят от способа выполнения.
Способ позволяет объявить базовый класс, передав функции объект со свойствами класса.
Принимаемые аргументы:
props {Object} – объект с собственными свойствами базового класса. Обязательный аргумент.staticProps {Object}] – объект со статическими свойствами базового класса.Возвращаемое значение: Function. Полностью сформированный класс.
modules.require(['inherit'], function(inherit) {
var props = {}, // объект свойств базового класса
baseClass = inherit(props); // базовый класс
});
Свойства объекта staticProps добавляются как статические к создаваемому классу.
Пример:
modules.require(['inherit'], function(inherit) {
var A = inherit(props, {
callMe : function() {
console.log('mr.Static');
}
});
A.callMe(); // mr.Static
});
__constructorТип: Function.
Объект собственных свойств базового класса может содержать зарезервированное свойство __constructor – функцию, которая будет автоматически вызвана при создании экземпляра класса.
Пример:
modules.require(['inherit'], function(inherit) {
var A = inherit({
__constructor : function(property) { // конструктор
this.property = property;
},
getProperty : function() {
return this.property + ' of instanceA';
}
}),
aInst = new A('Property');
aInst.getProperty(); // Property of instanceA
});
Способ позволяет создать производный класс на основе базового класса и объектов статических и собственных свойств.
Принимаемые аргументы:
BaseClass {Function} | {Array} – базовый класс. Может быть массивом функций-миксинов. Обязательный аргумент.props {Object} – собственные свойства (добавляются к прототипу). Обязательный аргумент.staticProps {Object}] – статические свойства.Если один из объектов содержит свойства, которые уже есть в базовом классе – свойства базового класса будут переопределены.
Возвращаемое значение: Function. Производный класс.
Пример:
modules.require(['inherit'], function(inherit) {
var A = inherit({
getType : function() {
return 'A';
}
});
// класс, производный от A
var B = inherit(A, {
getType : function() { // переопределение + 'super' call
return this.__base() + 'B';
}
});
var instanceOfB = new B();
instanceOfB.getType(); // возвращает 'AB'
});
При объявлении производного класса можно указать дополнительный набор функций. Их свойства будут примешаны к создаваемому классу. Для этого первым аргументом inherit нужно указать массив, первым элементом которого должен быть базовый класс, а последующими – примешиваемые функции.
Пример:
modules.require(['inherit'], function(inherit) {
var A = inherit({
getA : function() {
return 'A';
}
});
var B = inherit({
getB : function() {
return 'B';
}
});
// класс, производный от A и B
var C = inherit([A, B], {
getAll : function() {
return this.getA() + this.getB();
}
});
var instanceOfC = new C();
instanceOfC.getAll(); // возвращает 'AB'
});
__selfТип: *.
Позволяет получить доступ к классу из его экземпляра.
Пример:
modules.require(['inherit'], function(inherit) {
var A = inherit({
getStaticProperty : function() {
return this.__self.staticMethod; // доступ к статическим методам
}
}, {
staticProperty : 'staticA',
staticMethod : function() {
return this.staticProperty;
}
}),
aInst = new A();
aInst.getStaticProperty(); //staticA
});
__baseТип: Function.
Позволяет внутри производного класса вызывать одноименные методы базового (supercall). При использовании в статическом методе, будет вызван одноименный статический метод базового класса.
Пример:
modules.require(['inherit'], function(inherit) {
var A = inherit({
getType : function() {
return 'A';
}
}, {
staticProperty : 'staticA',
staticMethod : function() {
return this.staticProperty;
}
});
// класс, производный от A
var B = inherit(A, {
getType : function() { // переопределение + 'super' call
return this.__base() + 'B';
}
}, {
staticMethod : function() { // статическое переопределение + 'super' call
return this.__base() + ' of staticB';
}
});
var instanceOfB = new B();
instanceOfB.getType(); // возвращает 'AB'
B.staticMethod(); // возвращает 'staticA of staticB'
});
Дополнительные примеры смотрите в репозитории библиотеки inherit.