读写器和静态

接口通常主要由方法组成,但也可以持有非函数值的属性。 例如,Map对象有size属性,告诉你有多少个键存储在它们中。

这样的对象甚至不需要直接在实例中计算和存储这样的属性。 即使直接访问的属性也可能隐藏了方法调用。 这种方法称为读取器(getter),它们通过在方法名称前面编写get来定义。

  1. let varyingSize = {
  2. get size() {
  3. return Math.floor(Math.random() * 100);
  4. }
  5. };
  6. console.log(varyingSize.size);
  7. // → 73
  8. console.log(varyingSize.size);
  9. // → 49

每当有人读取此对象的size属性时,就会调用相关的方法。 当使用写入器(setter)写入属性时,可以做类似的事情。

  1. class Temperature {
  2. constructor(celsius) {
  3. this.celsius = celsius;
  4. }
  5. get fahrenheit() {
  6. return this.celsius * 1.8 + 32;
  7. }
  8. set fahrenheit(value) {
  9. this.celsius = (value - 32) / 1.8;
  10. }
  11. static fromFahrenheit(value) {
  12. return new Temperature((value - 32) / 1.8);
  13. }
  14. }
  15. let temp = new Temperature(22);
  16. console.log(temp.fahrenheit);
  17. // → 71.6
  18. temp.fahrenheit = 86;
  19. console.log(temp.celsius);
  20. // → 30

Temperature类允许你以摄氏度或华氏度读取和写入温度,但内部仅存储摄氏度,并在fahrenheit读写器中自动转换为摄氏度。

有时候你想直接向你的构造器附加一些属性,而不是原型。 这样的方法将无法访问类实例,但可以用来提供额外方法来创建实例。

在类声明内部,名称前面写有static的方法,存储在构造器中。 所以Temperature类可以让你写出Temperature.fromFahrenheit(100),来使用华氏温度创建一个温度。