Блок предоставляет функцию, реализующую механизмы для объявления и наследования классов.
Способ | Сигнатура | Возвращаемое значение | Описание |
---|---|---|---|
Объявление базового класса | inherit({Object} props , [{Object} staticProps] ) |
{Function} |
Служит для создания (декларации), базового класса на основе свойств объекта. |
Создание производного класса | inherit({Function} | {Array} BaseClass , {Object} props , [{Object} staticProps] ) |
{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.