所以我得到了我的Cube类
class Cube{
constructor(txt){
this._text = txt;
}
get text(){
return this._text;
}
set text(txt){
this._text = txt;
}
}
我可以实现类似的东西
let temp = new Cube('hello');
此时我不理解setter和getter的用法因为我可以做到这两点:
temp.text = 'bye';
console.log(temp.text);//shows bye
console.log(temp._text);//shows bye
temp._text = 'hello again';
console.log(temp.text);//shows hello again
console.log(temp._text);//shows hello again
所以当我想做类似的事情时,我假设我想要使用setter的唯一方法:
set text(txt){
this._text += txt;
}
有没有其他理由使用setter和getter?
答案 0 :(得分:6)
此时我并不理解使用者和吸气剂的用法,因为我可以同时执行这两项操作:[使用
text
并使用_text
]
只是因为您已将值存储在实例的属性中。您不必这样做,您可以将其存储在其他地方:
const Cube = function() {
const privateData = new WeakMap();
return class Cube {
constructor(txt){
privateData.set(this, {text: txt});
}
get text(){
return privateData.get(this).text;
}
set text(txt){
privateData.get(this).text = txt;
}
};
};
let temp = new Cube('hello');
temp.text = 'bye';
console.log(temp.text); // shows bye
console.log(temp._text); // shows undefined

或者只是让在课外使用更难(但并非不可能):
const Cube = function() {
const textProp = Symbol();
return class Cube {
constructor(txt){
this[textProp] = txt;
}
get text(){
return this[textProp];
}
set text(txt){
this[textProp] = txt;
}
};
};
let temp = new Cube('hello');
temp.text = 'bye';
console.log(temp.text); // shows bye
console.log(temp._text); // shows undefined

另请注意,由于get
和set
只是函数,因此您可以在其中执行任何。例如,可能set text
删除任何前导和尾随空格。也许 没有set text
,它只有一个吸气剂。也许设置text
更新一些其他属性。也许它记录了变化,因此您可以提供"撤消"在那个变化上。也许它会记录调试版本中的调试更改。
选择是无止境的。关键是,通过为您提供一种挂钩属性获取/设置操作的方法,您可以对它们执行任何操作。 (当然你可以使用和滥用...... :-))
在评论中你曾问过:
所以在我的情况下(第一个代码片段),基本上不需要get / set(因为我不想修改我的输入和输出)?
如果你只想要一个普通的,无聊的财产(这是我们大多数时候最想要的),那么就不需要getter / setter,只需使用普通的属性:
class Cube {
constructor(txt) {
this.text = txt;
}
}
最棒的是,如果你后来意识到你需要一个getter / setter,你可以改变它,使用Cube
编写的代码仍然有效。 : - )