Если вы хотите указать, что свойство age
не должно использоваться напрямую, вам следует использовать имя свойства, отличное от имени, используемого установщиками и получателями. Если свойство, которое устанавливает или получает установщик / получатель, имеет то же имя, что и установщик или получатель, оно просто будет продолжать вызывать себя, что приведет к вашей ошибке.
Общепринятое правило - ставить подчеркивание перед свойством:
class Person {
constructor(name, age) {
this.name = name;
this.age = age;
}
get name() {
return String(this._name);
}
get age() {
return String(this._age);
}
set name(name) {
this._name = name;
}
set age(age) {
this._age = age;
}
}
let p1 = new Person('Ehsan', 23);
console.log(p1.age);
p1.age = 32;
console.log(p1.age);
Но свойство по-прежнему доступно для просмотра пользователям через p1._age
- если вы хотите предотвратить это, вы можете сделать его более закрытым с закрытием и WeakMap
:
const Person = (() => {
const privateVals = new WeakMap();
return class Person {
constructor(name, age) {
const privateObj = {};
privateObj.name = name;
privateObj.age = age;
privateVals.set(this, privateObj);
}
get name() {
return String(privateVals.get(this).name);
}
get age() {
return String(privateVals.get(this).age);
}
set name(name) {
privateVals.get(this).name = name;
}
set age(age) {
privateVals.get(this).age = age;
}
}
})();
let p1 = new Person('Ehsan', 23);
console.log(p1.age);
p1.age = 32;
console.log(p1.age);