А вы знали, что в современном 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. Еще лучше то, что делается это простым добавлением решетки # вначале.