EN RU
Форум

Методология

Технологии

Инструментарий

Библиотеки

Учебные материалы

DocumentationJSDocSource

inherit

Блок предоставляет функцию, реализующую механизмы для объявления и наследования классов.

Обзор

Способы использования функции

Способ Сигнатура Возвращаемое значение Описание
Объявление базового класса inherit(
{Object} props,
[{Object} staticProps])
{Function} Служит для создания (декларации), базового класса на основе свойств объекта.
Создание производного класса inherit(
{Function} | {Array} BaseClass,
{Object} props,
[{Object} staticProps])
{Function} Позволяет наследовать и доопределять свойства и методы базового класса.

Специализированные поля объявляемого класса

Имя Тип данных Описание
__constructor {Function} Функция, которая будет вызвана в ходе создании экземпляра класса.

Специализированные поля экземпляра объявляемого класса

Поле Тип данных Описание
__self {*} Позволяет получить доступ к классу из его экземпляра.
__base {Function} Позволяет внутри производного класса использовать методы базового (supercall).

Публичные технологии блока

Блок реализован в технологиях:

  • vanilla.js

Подробности

Функция inherit позволяет:

  • создавать класс по декларации;
  • задавать метод-конструктор;
  • использовать миксины;
  • вызывать методы базовой реализации (super call);
  • получать доступ к статическим свойствам класса из его экземпляра.

Блок является основой механизма наследования блоков в 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.

Module inherit

This module provides some syntax sugar for "class" declarations, constructors, mixins, "super" calls and static members.
Creates class
parameters
baseClass|baseClassAndMixins
Function, Array
class (or class and mixins) to inherit from
prototypeFields
Object
staticFields
Object
returns
Function
class