https://ru.bem.info/libs/bem-core/v2.6.0/desktop/i-bem/#Простое-наследование
Для доступа к методам родителя служит специальное поле контекста this.__base
По факту this.__base()
делает инициализацию baseBlock
. А методы базового блока стали методами текущего объявленного.
Нет, все правильно написано. если есть блок
А
с методома
и от него наследуется блокБ
с методома
то вызовthis.__base()
внутиБ#a
- это вызовA#a
, то есть доступ к методу родителя.Всё понял, спасибо. Но формулировка всё равно выходит некорректная.
Почему?
Потому что
this.__base
служит для доступа к одному единственному методу соответсвующего текущему, а не к методам родителя."к методам родителя, соответствующим методам потомка".) Но да, возможно, текущую формулировку и стоит заменить, раз она может быть неправильно понята. Только тогда абзац текста получится вместо одного предложения.
@Guria не откажемся от уточняющего пулл-реквеста ;)
Подскажите по наследованию
Блок quals-menu инициализируется. При вызове метода hello - выводит в консоль hello, а this.__base() -> undefined
upd. Если сделать вывод this.__base -> undefined
@belozyorcev В блоке
quals-menu
anchors-menu
метод hello что возвращает?@zxqfox там нет этого метода
а в quals-menu выводит hello
@belozyorcev поэтому
console.log(this.__base());
возвращает undefined.this.__base
нужно вызывать в дочернем методе, чтобы выполнить код из родительского.Что хочешь добиться?
Не пойму тебя. Можешь на примере?
Есть меню с якорями. Возникла необходимость создания такого меню для другой страницы но с некоторыми отличиями поведения и расширенными элементами. Чтобы не засорять базовый блок - хочу сделать на основе него новый.
Это я и так понял. Более конкретно ;-)
Нужен метод добавления/обновления элементов в блок. И реинициализации якорей
Создай
reinit
в anchors-menu, и вызывай его простоthis.reinit
.this.__base()
нужен не для получения родителя, а для суперколла — вызова одноименного метода в родительском классе. Т.е. когда ты зовешьthis.__base()
в методеhello
блокаquals-menu
— происходит попытка вызвать методhello
вanchors-menu
.@zxqfox пробовал и так тоже
Uncaught TypeError: this.reinit is not a function
В родителе
В дочернем блоке
А если?
Попробовал сделать так, но элементы родителя опять недоступны
Пока решено просто дублировать anchors-menu (что нежелательно).
@tadatuta можешь разъяснить где ошибка?
@belozyorcev А вот так пробовал?)
В родителе
В дочернем блоке
В родителе
В дочернем блоке
В результате ничего не выводит
П.Н. Методы блока вызываю через инстанс jquery
@belozyorcev
@ilyar спасибо :) Думал в ту сторону, но не решался.
так всё работает. Странно почему в другом варианте не работает...
@belozyorcev Действительно не понятно почему, вариант из документации работает тут bem-components/common.blocks/button/button.js#L16.
@belozyorcev @ilyar наконец добрался проверить, у меня работает:
В результате в консоли, как и ожидается:
Возможно, блоки собирались в неправильном порядке или где-то были опечатки?