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

Последнее обновление: 1.12.2019

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

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) {
	this.name = name;
	var _age = 1;
	this.displayInfo = function(){
		console.log("Имя: " + 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("Том");
console.log(tom._age); // undefined - _age - локальная переменная
console.log(tom.getAge()); // 1
tom.setAge(32);
console.log(tom.getAge()); // 32
tom.setAge("54"); // Недопустимое значение
tom.setAge(123); // Недопустимое значение

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

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

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

Помощь сайту
WebMoney
  • P378451176208
  • Z280152397659
ЮMoney/Яндекс-Деньги
  • 410011174743222
PayPal
  • metanit22@mail.ru
Перевод на карту
  • Номер карты: 4048415020898850