В документации описано достаточно про методы. Но как доходит до статических, то как-то вот так.
Можно более подробно узнать их назначении? Допустим я делаю поиск блока
this.__smaller = this.findBlockInside('smaller')
Как теперь обращаться и к каким методам? Если посмотреть информацию в консоли
console.log(this.__smaller)
то будет видно, что стандартные методы из декларации доступны в объекте
__proto__
и к ним можно обращаться просто
this.__smaller.goodJump()
В связи с данной ситуацией у меня появились большие сомнения о том, что понял назначение статистических методов. Только что-то далёкое, но не осознанное.
@belozyorcev Статические методы можно воспринимать как методы класса. Они не зависят от каждого конкретного экземпляра блока.
Например, для любого блока b1 можно определить метод
getName()
, который будет возвращать имя блока. Оно всегда будет одно и то же, не зависимо от того, какой из блоковb1
мы спросим. Или какой-нибудьgetTwoPlusTwo()
— он всегда возвращает4
.При этом для методов получения или изменения свойств конкретного блока статические методы не подойдут: если мы хотим получить координаты
b1
, то очевидно, что для разных экземпляровb1
они могут отличаться. Или, скажем, мы хотим задать значениеinput
— нам нужно мочь в поле login задать одно, а в password — другое.Зачем это нужно.
BEMDOM.blocks.b1.myStaticMethod()
.Ответил ли я на вопрос?
@tadatuta вроде как. Стало понятней, но ещё сидит недоосознанность внутри меня.
Т.е. вызов статистического метода влияет на все экземпляры блока? Если я сделаю
BEMDOM.blocks.b1.hideBlock()
, то все блокиb1
скроются?Если ты вызовешь
BEMDOM.blocks.b1.hideBlock()
, то выполнится то, что написано в кодеhideBlocks()
;)Чтобы такой метод умел спрятать все блоки, ему придется как-то узнать о них о всех. Это можно реализовать, например, добавляя каждый новый блок в какой-нибудь
this.__self.storage
при инициализации. Тогда можно будет вhideBlocks()
вызватьthis.storage.forEach(function(block) { block.hide(); });
Я имел ввиду что-то типо этого. Что сделает вызов
BEMDOM.blocks.b1.hideBlock()
при такой декларации?скажет
undefined is not a function
;)Как можно их поженить:
а чтобы обратиться из динамических к статическим?
Разве? Простые ("динамические") методы не должны копироваться для каждого блока, они ведь в прототипе. А вместо
BEMDOM.blocks.b1.myStaticMethod()
, мне кажется, лучше по-честному добавлять b1 в зависимости.@belozyorcev
да, верно.
@apsavin да, по первому пункту ты, похоже, прав. а про добавление в зависимости вместо
BEMDOM.blocks.b1.myStaticMethod()
я не понял.@tadatuta @apsavin наверное имел ввиду
modules.define('scroller', ['i-bem__dom', 'b1'], function(provide, BEMDOM, b1) {} )
Да.
@belozyorcev @apsavin да, согласен.