Инкапсуляция

Инкапсуляция является одним из ключевых понятий объектно-ориентированного программирования и представляет сокрытие состояния объекта от прямого доступа извне. По умолчанию все свойства объектов являются публичными, общедоступными, и мы к ним можем обратиться из любого места программы.

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);
console.log(tom._age); // undefined - _age - локальная переменная
console.log(tom.getAge()); // 26
tom.setAge(32);
console.log(tom.getAge()); // 32
tom.setAge("54"); // Недопустимое значение

В конструкторе User объявляется локальная переменная _age вместо свойства age. Как правило, названия локальных переменных в конструкторах начинаются со знака подчеркивания.

Для того, чтобы работать с возрастом пользователя извне, определяются два метода. Метод getAge() предназначен для получения значения переменной _age. Этот метод еще называется геттер (getter). Второй метод - setAge, который еще называется сеттер (setter), предназначен для установки значения переменной _age.

Плюсом такого подхода является то, что мы имеем больший контроль над доступом к значению _age. Например, мы можем проверить какие-то сопутствующие условия, как в данном случае проверяются тип значение (он должен представлять число), само значение (возраст не может быть меньше 0).

Output