Приватные метоты в объектах JavaScript

При разработке класса на JavaScript у меня возникла определённая проблема: мне хотелось чтобы в классе были публичные и приватные методы (как, например в других языках программирования). Для демонстрации я приведу выдуманный пример:

<pre >
function Stack() {
  //private
  var stack = new Array();
  var savetype = function (value) {
    this.pushed_type = typeof value;
  }

  //public
  this.pushed_type = undefined;
  this.push = function (value) {
    stack.push(value);
    savetype(value);
  }
  this.pop = function () {
    if (stack.length > 0) {
      return stack.pop();
    } else {
      return null;
    }
  }
}

Когда мы создаём объект и вызываем метод push, то при вызове «приватной» фунции savetype тип переданного значения не сохранятся в публичном поле pushed_type. Точнее, он сохраняется но совершенно у другого объекта. При выходе из этой функции можно проверить, что поле pushed_type не изменилось. При этом, доступ к «приватным» полям работает правильно.
Решить данную сложность помогла передача ссылки на объект при вызове приватной функции.

<code class="javascript">function Stack() {
  //private
  var stack = new Array();
  var savetype = function (self, value) {
    self.pushed_type = typeof value;
    //self.pushed_type = stack[stack.length - 1]; - также работает
  }

  //public
  this.pushed_type = undefined;
  this.push = function (value) {
    stack.push(value);
    savetype(self, value);
  }
  this.pop = function () {
    if (stack.length > 0) {
      return stack.pop();
    } else {
      return null;
    }
  }
}
</code>

Я понимаю, что в других языках программирования данная ссылка передаётся неявно, как в приватных, так и в публичных методах. В JavaScript также можно получить ссылку на экземпляр через this — неявный «парамерт». Сложность заключается в том, что в «приватном» методе this не представляет экземпляр, поэтому использование this для обращения из таких методов к публичным полям или методам невозможно.

Это первый пост на хабре. Критике рад.


0 комментариев

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.