javaScript中setter的优点是什么

javaScript中setter的优点是什么,javascript,setter,Javascript,Setter,所以我从一段时间前就开始学习JavaScript,我真的无法获得使用setter的优势。 和yes一样,getter似乎有助于避免不必要地替换变量的值,尽管对于setter,它表示在设置属性之前检查新数据是否有效是有用的 但是,我们甚至不需要使用setter就可以做到这一点 比如说, const person = { height: 150, set newHeight(num){ if(typeof(num)=='number' &&am

所以我从一段时间前就开始学习JavaScript,我真的无法获得使用setter的优势。
和yes一样,getter似乎有助于避免不必要地替换变量的值,尽管对于setter,它表示在设置属性之前检查新数据是否有效是有用的 但是,我们甚至不需要使用setter就可以做到这一点
比如说,

    const person = {
      height: 150,
      set newHeight(num){
        if(typeof(num)=='number' && num>=0)
        {
          this.height=num
        }
        else
        {
          console.log('error');
        }
      }
    };

    person.newHeight=200
    console.log(person.height) //output:200
这就是使用setter,
如果我们不使用setter

const person = {
  height: 150,
  newHeight(num){
    if(typeof(num)=='number' && num>0)
    {
      this.height=num
    }
    else
    {
      console.log('error');
    }
  }
};

person.newHeight(200)
console.log(person.height) //output:200
那么,使用setter和不使用setter到底有什么区别呢
对不起,如果我好像出了什么问题

提前感谢

getter和setter源于封装的思想,封装在Java等语言中是一个更强大的概念。在Java中,强烈建议不要使用以下代码:

myObj.somePublicVar = newVal;
而这在Javascript中是常见的做法。在Java中,约定是为每个要公开的变量创建一个getter和setter,并将变量本身声明为
private
。所以你会:

private int myVar;
public int getMyVar() {
  return myVar;
}
public void setMyVar(int val) {
  this.myVar = val;
}
理论上,这有助于防止对对象内部状态进行意外或不必要的修改。例如,您可能希望只公开所述状态的getter,而不允许设置它们。这样,其他将您的代码用作库的程序员就不太可能在不知情的情况下弄乱一些重要的状态而破坏您的代码。另外,例如,您可能希望在实际设置新值之前对其进行验证,因此您可能会遇到以下情况:

public void setScore(int val) {
  if (val < 0) this.score = 0;
  else if (val > 100) this.score = 100;
  else this.score = val;
}
public void setScore(int val){
如果(val<0),则该分数=0;
否则,如果(val>100)this.score=100;
否则,这个.score=val;
}
然而,在实践中,这种严格执行公约的做法往往会带来更多的麻烦,而不是好处。您经常看到Java类有50%以上的行专门用于各种getter和setter,这会减慢开发速度



Javascript增加了对getter和setter的支持,因此如果开发人员想要更严格的控制,他们可以这样做。然而,除非你正在开发一个图书馆,或者你是一个大型合作项目的一部分,否则我怀疑这些好处是否有实际价值。因此,TLDR;如果您只是一个普通的开发人员,或者您只从事小项目,请不要费心——这会带来更多的麻烦,而不是好处。

这是关于良好的编程实践。想想你是否需要分享你的代码。这也是一种很好的组织技巧,即使你是唯一使用代码的人。属性不仅仅是不允许无效值。它可以触发事件(例如,更新图像大小将启动布局逻辑)、返回计算值而无需内存备份,甚至可以通过对象池控制对有限资源的访问。