Skip to main content

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

Пример до классов JS

function Car1(model, year) {
var mileage = 0; // Приватная переменная, доступная только внутри конструктора -> потому что var

this.model = model; // Публичное свойство
this.year = year; // Публичное свойство

// Публичный метод, имеющий доступ к приватной переменной
this.drive = function (distance) {
mileage += distance;
return `Driven ${distance} miles, total: ${mileage} miles.`;
};

// Приватный метод (только в контексте этого примера, в JS напрямую приватные методы не поддерживаются до ES6)
function updateMileage(amount) {
mileage += amount;
}
}

var myCar1 = new Car1("Toyota", 2005);
console.log(myCar1.drive(150));
console.log(myCar1.mileage); // undefined, так как mileage - приватная переменная

Пример на классах JS

class Car2 {
#mileage = 0; // Приватное поле
model;
year;

constructor(model, year) {
this.model = model; // Публичное свойство
this.year = year; // Публичное свойство
}

drive(distance) {
if (distance >= 0) {
this.#mileage += distance;
return `Driven ${distance} miles, total: ${this.#mileage} miles.`;
}
}

// Приватный метод
#updateMileage(amount) {
if (amount >= 0) this.#mileage += amount;
else {
// error | message | alert
}
}
}

const myCar2 = new Car2("Toyota", 2005);
console.log(myCar2.drive(150));
console.log(myCar2.mileage); // SyntaxError: Private field '#mileage' must be declared in an enclosing class