Шаблон модуля JavaScript: как частные методы получают доступ к модулю?
При реализации шаблона модуля, как частные функции получают доступ к приватным свойствам модуля? Я не видел примеров, где разработчики это делают. Есть ли причина не в том, чтобы?
var module = (function(){
// private property
var number = 0;
// private method
_privateIncrement = function(){
// how do I access private properties here?
number++;
};
// public api
return {
// OK
getNumber: function(){
return number;
},
// OK
incrNumber: function(){
number++;
},
// Doesn't work. _privateIncrement doesn't have
// access to the module scope.
privateIncrNumber: function(){
_privateIncrement();
}
};
})();
Ответы
Ответ 1
При реализации шаблона модуля, как частные функции получают доступ к приватным свойствам модуля?
Свойства находятся в области видимости, поэтому они "просто делают"
Не работает.
Да, это так.
_privateIncrement
не имеет доступа к области видимости модуля.
Да, это так.
Смотрите живой пример следующего содержания:
var module = (function(){
// private property
var number = 0;
// global method
_privateIncrement = function(){
number++;
};
// public api
return {
// OK
getNumber: function(){
return number;
},
// OK
incrNumber: function(){
number++;
},
// Does work!
privateIncrNumber: function(){
_privateIncrement();
}
};
})();
// Show default value
document.body.innerHTML += (module.getNumber());
// Increment
module.privateIncrNumber();
// Show new value
document.body.innerHTML += (module.getNumber());
// Increment (since _privateIncrement was defined as a global!)
_privateIncrement();
// Show new value
document.body.innerHTML += (module.getNumber());
// Output: 012
Ответ 2
Альтернативой приватным методам с доступом к this
является использование методов call
или apply
.
function Restaurant()
{
this.mongoose = 'beans';
this.freedom = {bear:'love',a:'12'};
var myPrivateVar;
var private_stuff = function() // Only visible inside Restaurant()
{
myPrivateVar = "I can set this here!";
this.mongoose = 12;
}
this.use_restroom = function() // use_restroom is visible to all
{
private_stuff();
}
this.buy_food = function() // buy_food is visible to all
{
private_stuff();
}
private_stuff.call(this);
}
var bobbys = new Restaurant();
Конечно, вы бы переместили use_restroom и buy_food в прототип и private_stuff за пределами конструктора, если планируете иметь несколько экземпляров этого объекта.