Приватные метоты в объектах JavaScript
При разработке класса на JavaScript у меня возникла определённая проблема: мне хотелось чтобы в классе были публичные и приватные методы (как, например в других языках программирования). Для демонстрации я приведу выдуманный пример:
<pre >
Когда мы создаём объект и вызываем метод push, то при вызове «приватной» фунции savetype тип переданного значения не сохранятся в публичном поле pushed_type. Точнее, он сохраняется но совершенно у другого объекта. При выходе из этой функции можно проверить, что поле pushed_type не изменилось. При этом, доступ к «приватным» полям работает правильно.
Решить данную сложность помогла передача ссылки на объект при вызове приватной функции.
Я понимаю, что в других языках программирования данная ссылка передаётся неявно, как в приватных, так и в публичных методах. В JavaScript также можно получить ссылку на экземпляр через this — неявный «парамерт». Сложность заключается в том, что в «приватном» методе this не представляет экземпляр, поэтому использование this для обращения из таких методов к публичным полям или методам невозможно.
Это первый пост на хабре. Критике рад.
<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 комментариев