@cocomuffin

Нужны ли геттеры и сеттеры в классах JS?

Доброго времени суток!
Не могли бы вы мне объяснить, для чего используются геттеры и сеттеры в классах в 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?
  • Вопрос задан
  • 2179 просмотров
Пригласить эксперта
Ответы на вопрос 1
john36allTa
@john36allTa
alien glow of a dirty mind
Геттеры и сеттеры работают верно, почему можно получить имя через catName()?
cat.__defineGetter__("catName", function() { return name});
cat.__defineSetter__("catName", function(_name) { name = _name});

Так это устроено. В классах чего действительно не хватает, так это приватных переменных. Но, есть хук:
function Cat2 () {
  let catName;
  return Object.freeze({
  	get name() { return catName},
  	set name(newName) {catName = newName},
  	whoami
  });
  function whoami(){
  	console.log(`Cat, ${catName}`);
  }
}

Теперь у нас есть геттеры, сеттеры и "приватная" переменная.
let barsik = new Cat2();
barsik.name = "Barsik";
barsik.catName; // undefined
barsik.name;  // "Barsik";
barsik.whoami(); // Cat, Barsik
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы