Инкапсуляция
Инкапсуляция является одним из ключевых понятий объектно-ориентированного программирования и представляет сокрытие состояния объекта от прямого доступа извне. По умолчанию все свойства объектов являются публичными, общедоступными, и мы к ним можем обратиться из любого места программы.
function User(pName, pAge) {
this.name = pName;
this.age = pAge;
this.displayInfo = function(){
document.write("Имя: " + this.name + "; возраст: " + this.age);
};
};
var tom = new User("Том", 26);
tom.name=34;
console.log(tom.name);
Мы можем их скрыть от доступа извне, сделав свойства локальными переменными:
function User (name, age) {
this.name = name;
var _age = age;
this.displayInfo = function(){
document.write("Имя: " + this.name + "; возраст: " + _age + "
");
};
this.getAge = function() {
return _age;
}
this.setAge = function(age) {
if(typeof age === "number" && age >0 && age<110){
_age = age;
} else {
console.log("Недопустимое значение");
}
}
}
var tom = new User("Том", 26);
// undefined _age - локальная переменная
console.log(tom._age);
// 26
console.log(tom.getAge());
tom.setAge(32);
// 32
console.log(tom.getAge());
// недопустимое значение
tom.setAge("54");
В конструкторе User
объявляется локальная переменная _age
вместо свойства age
. Как правило, названия локальных переменных в конструкторах начинаются со знака подчеркивания.
Для того, чтобы работать с возрастом пользователя извне, определяются два метода. Метод getAge()
предназначен для получения значения переменной _age
. Этот метод еще называется геттер (getter)
. Второй метод setAge
, который еще называется сеттер (setter)
, предназначен для установки значения переменной _age
.
Плюсом такого подхода является то, что мы имеем больший контроль над доступом к значению _age
. Например, мы можем проверить какие-то сопутствующие условия, как в данном случае проверяются тип значение (он должен представлять число), само значение (возраст не может быть меньше 0).