10-静态方法
9.2.5 静态方法
目前为止,讨论的方法都是实例方法。也就是说,它们只针对每个具体的实例才有用。还有一种静态方法(也叫类方法),它不与实例绑定。在静态方法中,this绑定的是类本身,但通常使用类名来代替 this 是公认的最佳实践。
静态方法通常用来执行一些与类相关的任务,而非跟具体的实例相关。下面将沿用汽车VINs(车辆识别码)的例子。单独的汽车能够产生自己的VIN显然是不合理的,那么如何防止两辆汽车使用相同的VIN呢?分配VIN是一个对于大部分汽车都适用的抽象概念,因此,这是一个适合静态方法的场景。另外,静态方法通常是一些用来操作多辆汽车的方法。例如,可能希望有一个叫 areSimilar 方法来判断两辆汽车是否具有相同的品牌和型号,或者 areSame 方法来判断两辆车是否具有相同的VIN。下面来看看这些静态方法在 Car 中的实现:
class Car {
static getNextVin() {
return Car.nextVin++; // 也可以使用 this.nextVin++,
//这里使用Car是为了强调这是一个静态方法
}
constructor(make, model) {
this.make = make;
this.model = model;
this.vin = Car.getNextVin();
}
static areSimilar(car1, car2) {
return car1.make===car2.make && car1.model===car2.model;
}
static areSame(car1, car2) {
return car1.vin===car2.vin;
}
}
Car.nextVin = 0;
const car1 = new Car("Tesla", "S");
const car2 = new Car("Mazda", "3");
const car3 = new Car("Mazda", "3");
car1.vin; // 0
car2.vin; // 1
car3.vin // 2
Car.areSimilar(car1, car2); // false
Car.areSimilar(car2, car3); // true
Car.areSame(car2, car3); // false
Car.areSame(car2, car2); // true