Новые es6 классы, имеют геттеры и нормально наследуемые cтатичные свойства,
но у них есть один существенный недостаток структуры декларации класса:
Между конструктором и методами в публичной областью нету общего скуопа, а так же аргументы конструктора недоступны из публичных методов.
Следовательно, нам приходится выносить локальные переменные в публичную область, чтобы иметь к ним доступ из публичным методов:
//было:
function Foo (element) {
var foo = 123;
return {
log: () => {
console.log(element, foo);
}
}
}
//стало:
class Foo {
constructor(element) {
this.element = element;
this.foo;
}
log() {
console.log(this.element, this.foo);
}
}У нас теряется инкапсуляция свойства element и foo, что я считаю критично.
По опыту (this.init в компонентах у нас так же не имел общего скоупа с публичными методами)
мы начинаем изначально все свойства и методы пихать в паблик, не зависимо от того,
нужны они нам в публичных методах или нет - чтобы не переписывать юзаджы когда нам понадобится на нее сослаться в методах.
В итоге у нас весь код лежит в публичной области видимости:
- это огромная потеря для понимания и читаемости кода.
- потеряем инкапсуляцию = тяжело рефакторить, не известно какой кусок кода зависит от клиентов инстанса, а какой внутренний.
В случае без наследования с es6 мы получаем проблемы, но профитов мы получаем.
Если есть наследование - __классы норм тема__ , там дополнительных проблем с вводом es6 не появляется, так как чтобы переопределить метод, нужно чтобы нужные свойства фигурирумые в этом методе были так же доступны извне (в нормальных языках они были бы протектед).
То есть опять таки все лежит в публичной области видимости, но тут это обусловлено наследованием.
Нужно ли наследование - отдельная тема.
На практике мы наследуемся крайне редко и это хорошо - ибо смотрите HH/Form.
Поэтому предлагаю такую схему:
Если __ТОЧНО__ нужно наследование (а не композиция или что-то другое) - можно использовать es6классы,
В ином случае - пишем по старому.