Skip to content

Instantly share code, notes, and snippets.

@zhdanovme
Last active May 18, 2016 11:16
Show Gist options
  • Select an option

  • Save zhdanovme/ed0271f371bf0320e6b60797328cf826 to your computer and use it in GitHub Desktop.

Select an option

Save zhdanovme/ed0271f371bf0320e6b60797328cf826 to your computer and use it in GitHub Desktop.

Новые 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классы,
В ином случае - пишем по старому.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment