А вы знали, что в современном JavaScript есть поддержка специального синтаксиса для создания приватных переменных и функций?
По-умолчанию все методы и свойства класса являются публичными (общедоступными). Для того, чтобы сделать их приватными, достаточно начинать их названия с решетки #.
class Developer {
  name;
  #age; // Мой возраст никто не должен знать!
  constructor(name, age) {
    this.name = name;
    this.#age = age;
  }
};
const Mikhail = new Developer('Mikhail', 35);
console.log(Mikhail.name); // Mikhail
console.log(Mikhail.age);  // undefined
console.log(Mikhail.#age); // Error!  Uncaught SyntaxError: Private field '#age' must be declared in an enclosing classСвойство Mikhail.name доступно, так как является публичным, в то время как возраст является приватными потому, что начинается с #. Тоже самое работает и с методами:
class Developer {
  name;
  #age; // Мой возраст никто не должен знать!
  constructor(name, age) {
    this.name = name;
    this.#age = age;
  }
  #getAgeInDogYears() {
    return this.#age * 7;
  }
};Метод getAgeInDogYears может быть вызван только внутри класса. Мы можем дать ему доступ из вне, используя внутри публичного метода:
class Developer {
  name = '';
  #age = 0;
  #ageInDogYears = 0;
  constructor(name, age) {
    this.name = name;
    this.#age = age;
    this.#ageInDogYears = this.#getAgeInDogYears();
  }
  #getAgeInDogYears() {
    return this.#age * 7;
  }
  log() {
    console.log(this.name);
    console.log(this.#age);
    console.log(this.#ageInDogYears);
  }
};
const Mikhail = new Developer('Mikhail', 35);
Mikhail.log();
// Mikhail
// 35
// 245Добавление такого синтаксиса в JavaScript стало приятным дополнением к современному JS. Еще лучше то, что делается это простым добавлением решетки # вначале.
