Доброго времени суток!
Не могли бы вы мне объяснить, для чего используются геттеры и сеттеры в классах в JS?
Условно, есть класс:
class Cat {
constructor(name) {
this.name = name;
}
get catName() {
return this.name.toUpperCase(); // toUpperCase для того, чтобы различать геттер и вызов свойства
}
set catName (newCatName) {
if (!newCatName) {
console.log('Имя должно содержать хотя бы одну букву!');
} else {
this.name = newCatName;
}
}
}
const cat = new Cat('Bob');
cat.name; //Bob
cat.catName; //BOB
cat.catName = 'Kiki';
cat.catName; //KIKI
cat.name = 'Jom';
cat.catName; //JOM
Однако, получить свойство name можно как через cat.catName(), так и через cat.name, таким же образом можно изменять это свойство, как через cat.catName = 'Bon' или cat.name = 'Bon'.
Вот
тут пишут, что геттеры-сеттеры нужны для управляемого состояния свойств, т.е. чтобы было нельзя просто взять и поменять свойство, обратившись к нему через точку. Однако, насколько понимаю, это касается функций-конструкторов, а именно если записать класс, описанный выше, в виде:
function Cat2 () {
let catName;
this.setName = function(name) {
if (!name) {
return 'Имя должно содержать хотя бы одну букву!';
}
catName = name;
}
this.getName = function() {
return (catName ? catName : 'Сначала дайте котику имя!');
}
}
const cat2 = new Cat2();
cat2.setName('Bob');
cat2.getName(); //Bob
В таком случае свойства получившегося "класса" недоступны извне, тут понятно. С какой целью геттеры-сеттеры используются в классах ES6?