В руководстве по миграции https://ru.bem.info/libs/bem-core/v2.6.0/migration/#Деструктор написано, что «Вызывать base для того, чтобы у блоков работал базовый деструктор, определенный в i-bemdom, больше не нужно.»
Однако в блоке input
в bem-components родительский деструктор вызывается явно. https://github.com/bem/bem-components/blob/v2/desktop.blocks/input/input.js#L49-L57
Вопрос — когда такое делать необходимо?
Речь о том, что базовый деструктор позовется автоматически и отпишется от событий, на которые был подписан блок и удалит ссылку на блок из реестра
BEMDOM.blocks
, но если блок помимо этого еще где-то «наследил», то такие штуки нужно прибирать за собой руками.В случае с
input
в замыкании хранится список ссылок на все инстансы, чтобы реализовать честный кроссбраузерныйchange
. Его и приходится прибивать руками.Если базовый деструктор был вызван вручную, то он вторично не вызовется, верно?
Кажется, я, наконец, понял, о чем ты на самом деле спрашиваешь :)
__base()
вinput
, никакой дополнительный код от этого не выполняется. Но т.к. это доопределение на desktop-уровнеinput
-а с common-уровня, который в свою очередь наследуется отcontrol
, то позвать базовый метод — это хорошая практика на случай, если у кого-то из родителей появится своя реализация на удаление модификатораjs
.__base()
в реакции на удаление модификатораjs
, если это первый наследникi-bem
илиi-bem__dom
. Вbem-bl
в качестве деструктора нужно было перекрывать методdestruct()
, у которого была базовая реализация вi-bem.js
и ее требовалось явно вызвать. Вbem-core
она по-прежнему осталась, но мы теперь не перекрываем этот метод, а перекрываем реакцию на удаление модификатораjs
, у которого никакой базовой реализации нет. Так что, если не вызвать__base()
, ничего не случится. При этом если__base()
вызвать, то все равно ничего не случится — вызовется пустая функция.То есть, если у меня блок
dog
наследуется от блокаmammal
и я определил реакцию на удаление модификатора 'js' в обоих блоках, но при этом не вызываю__base()
вdog
, то функция изmammal
вызвана не будет?