Как создать закрытые методы в JavaScript классе

Мне нужно создать JavaScript класс с публичными методами. Обычно я делаю это так:

function Library() {}

Library.prototype.rent_book = function(){
   // код здесь
}

Library.prototype.return_book = function(){
   // код здесь
}

Тогда пользователи моего класса могут:

var library = new Library();
library.rent_book();
library.return_book();

Вопрос в том, как мне создать приватный метод? Мне нужно чтобы его могли вызывать методы rent_book и return_book, но чтобы его нельзя было вызвать снаружи.

То есть я хочу чтобы работало:

Library.prototype.rent_book = function() {
   this.internal_check();
}

Но это не должно работать:

var lib = new Library();
lib.internal_check(); // должна быть ошибка

Как правильно определить internal_check как приватный метод?

Можешь ещё замыкание использовать. Создаёшь функцию-конструктор, внутри объявляешь приватную функцию, потом в методах прототипа её используешь:

function Library() {
  var internal_check = function() {
    // приватный код
  };
  
  this.getInternalCheck = function() {
    return internal_check;
  };
}

Library.prototype.rent_book = function() {
  this.getInternalCheck()();
}

Так internal_check доступна только через геттер, напрямую к ней не подберёшься. Правда каждый экземпляр создаёт свою копию, но зато реально приватно.

Символы помогают создать настоящие приватные методы. Объявляешь символ вне класса и используешь как ключ:

const privateMethod = Symbol('internal_check');

function Library() {}

Library.prototype[privateMethod] = function() {
   // приватный код
}

Library.prototype.rent_book = function() {
   this[privateMethod]();
}

Метод станет недоступен снаружи, но внутри класса всё работает нормально.

А зачем вообще скрывать методы? Проще договориться, что методы с подчеркиванием приватные. Типа _internal_check() - сразу понятно, что трогать не стоит. В большинстве случаев хватает, код получается проще.