В руководстве по миграции 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вызвана не будет?