ES6的getter和setter与Java中类似概念有截然不同的动机。
在Java中,getter和setter允许一个类定义一个JavaBean。getter和setter的重点在于,它允许bean拥有一个完全正交的“接口”,而不是公共字段所暗示的接口。因此,我可以有一个名为“name”的字段,它不是JavaBean属性,我也可以有一个名为“address”的JavaBean属性,它不是一个字段。
JavaBean属性也可以通过Java反射由数千个框架(例如Hibernate)进行“发现”。因此,getter和setter是“公开”bean属性的标准方法之一。
作为函数,getter和setter还具有抽象实现的价值。它可以是字段或计算出的(“合成”)值。所以,如果我有一个名为“zipcode”的bean属性,它最初存储为字符串。现在假设我想将其更改为从地址/城市/州计算出的值?
如果使用字段,则此代码将会出错:
String zipcode = address.zipcode();
但是,如果我使用getter,这不会出现问题:
String zipcode = address.getZipcode();
JavaScript没有像JavaBeans一样的东西。据我所知,GET和SET的预期值仅限于上述“合成”(计算)属性。
但是它比Java要好一些,因为虽然Java不允许您将“字段”兼容地转换为方法,但ES6 GET和SET允许这样做。
也就是说,如果我有:
var zipcode = address.zipcode;
如果我将邮政编码从标准对象属性更改为getter,上述代码现在调用GET函数。
请注意,如果我没有在定义中包括GET,则不会调用zipcode GET方法。相反,它只会将函数zipcode分配给变量。
因此,我认为这些是理解Java和JavaScript ES6 getter和setter之间的一些重要区别。