Приватные переменные

Часть 4

Этот пример только в качестве бонуса и просто как идея. Мне самому подобная реализация не особо нравится, но пока лучшего я придумать не смог:

class Some
  test = $private 'test'

  constructor: ->
    @[test] = 23

console.log(new Some)

Что же тут происходит: Внутри класса мы объявляем var переменную test, в качестве значения которой будет строка [private test] (её возвращает функция $private). Далее мы просто используем эту переменную как имя для нашей реальной переменной. А так как имя у нас начинается с невидимого символа - доступ к переменной получить довольно сложно, особенно если префикс будет генерироваться из случайных невидимых символов.

Реализация:

window.$private = (name) ->
  unless defined 'ZERO_WIDTH_SPACE'
    define ZERO_WIDTH_SPACE: '​' # Тут пробел с нулевой шириной, в качестве значения
  return "#{ZERO_WIDTH_SPACE}[private #{name}]"

В результате, плюсы:

  • Реальные приватные переменные
  • В классах довольно объёмного размера может очень сильно помочь, т.к. очищает интерфейс этого класса от лишних методов\свойств, которые не стоит делать публичными

Минусы:

  • Очень громоздко и некрасиво
  • Неудобно пользоваться
  • Приходится добавлять префикс "$", т.к. это ключевое слово и оно зарезервировано