读写器和静态
接口通常主要由方法组成,但也可以持有非函数值的属性。 例如,Map对象有size属性,告诉你有多少个键存储在它们中。
这样的对象甚至不需要直接在实例中计算和存储这样的属性。 即使直接访问的属性也可能隐藏了方法调用。 这种方法称为读取器(getter),它们通过在方法名称前面编写get来定义。
let varyingSize = {get size() {return Math.floor(Math.random() * 100);}};console.log(varyingSize.size);// → 73console.log(varyingSize.size);// → 49
每当有人读取此对象的size属性时,就会调用相关的方法。 当使用写入器(setter)写入属性时,可以做类似的事情。
class Temperature {constructor(celsius) {this.celsius = celsius;}get fahrenheit() {return this.celsius * 1.8 + 32;}set fahrenheit(value) {this.celsius = (value - 32) / 1.8;}static fromFahrenheit(value) {return new Temperature((value - 32) / 1.8);}}let temp = new Temperature(22);console.log(temp.fahrenheit);// → 71.6temp.fahrenheit = 86;console.log(temp.celsius);// → 30
Temperature类允许你以摄氏度或华氏度读取和写入温度,但内部仅存储摄氏度,并在fahrenheit读写器中自动转换为摄氏度。
有时候你想直接向你的构造器附加一些属性,而不是原型。 这样的方法将无法访问类实例,但可以用来提供额外方法来创建实例。
在类声明内部,名称前面写有static的方法,存储在构造器中。 所以Temperature类可以让你写出Temperature.fromFahrenheit(100),来使用华氏温度创建一个温度。
