8.1 声明静态方法
在JavaScript中,静态方法是定义在类上的方法,而不是它的实例。它们直接在类上调用,而不是在由该类创建的对象上调用。静态方法通常用于创建与类相关的辅助功能,但与具体对象无关。
静态方法使用 static
关键字在类体中定义。
例子:
- 方法
add
和multiply
使用关键字static
声明为静态的 - 这些方法直接在类
MathHelper
上调用,而不是在它的实例上
JavaScript
class MathHelper {
static add(a, b) {
return a + b;
}
static multiply(a, b) {
return a * b;
}
}
console.log(MathHelper.add(5, 3)); // 8
console.log(MathHelper.multiply(5, 3)); // 15
8.2 使用静态方法
静态方法在以下场景中很有用:
- 辅助功能:静态方法可用于创建执行与类相关操作的实用函数。
- 工厂方法:静态方法可用于使用特定逻辑创建类的实例。
- 数据处理:静态方法可用于处理与类相关的数据,但不需要创建类的实例。
辅助功能的例子:
- 类
StringUtil
包含静态方法capitalize
和reverse
,这些方法用于处理字符串 - 这些方法直接在类
StringUtil
上调用
JavaScript
class StringUtil {
static capitalize(str) {
return str.charAt(0).toUpperCase() + str.slice(1);
}
static reverse(str) {
return str.split('').reverse().join('');
}
}
console.log(StringUtil.capitalize('hello')); // "Hello"
console.log(StringUtil.reverse('hello')); // "olleh"
工厂方法的例子:
静态方法 fromObject
从数据对象创建类 Car
的实例。
JavaScript
class Car {
constructor(brand, model) {
this.brand = brand;
this.model = model;
}
static fromObject(obj) {
return new Car(obj.brand, obj.model);
}
}
const carData = { brand: 'Toyota', model: 'Camry' };
const car = Car.fromObject(carData);
console.log(car.brand); // "Toyota"
console.log(car.model); // "Camry"
8.3 静态方法和继承
在JavaScript中,静态方法也会被派生类继承。派生类可以使用基类的静态方法或重写它们。
继承静态方法的例子:
- 静态方法
identify
在类Animal
中定义,并在类Dog
中重写 - 在两个类上调用方法
identify
JavaScript
class Animal {
static identify() {
return 'This is an animal';
}
}
class Dog extends Animal {
static identify() {
return 'This is a dog';
}
}
console.log(Animal.identify()); // "This is an animal"
console.log(Dog.identify()); // "This is a dog"
8.4 在其他方法中访问静态方法
静态方法可以通过类名在类的其他方法中调用。
例子:
静态方法 calculateArea
在另一个静态方法 describeCircle
中调用,使用关键字 this
,它在此上下文中引用类 Geometry
本身。
JavaScript
class Geometry {
static calculateArea(radius) {
return Math.PI * radius * radius;
}
static describeCircle(radius) {
const area = this.calculateArea(radius);
return `A circle with radius ${radius} has an area of ${area.toFixed(2)}.`;
}
}
console.log(Geometry.describeCircle(5)); // "A circle with radius 5 has an area of 78.54."
8.5 静态方法和类的实例
静态方法不能在类的实例上调用。尝试在实例上调用静态方法会导致错误。
例子:
静态方法 add
在类 Calculator
上调用,而不是在它的实例 calc
上。
JavaScript
class Calculator {
static add(a, b) {
return a + b;
}
}
const calc = new Calculator();
console.log(Calculator.add(3, 4)); // 7
console.log(calc.add(3, 4)); // 错误: calc.add 不是一个函数
GO TO FULL VERSION