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