在 JavaScript 中,静态属性和静态方法是直接附加到类本身而不是类的实例上的成员。它们通过 static
关键字定义,无需创建类的实例即可访问。
静态方法是类的方法,而不是实例的方法。它们通常用于实现与类相关但不依赖于特定实例的功能。
class MyClass {
static staticMethod() {
return '这是一个静态方法';
}
instanceMethod() {
return '这是一个实例方法';
}
}
// 调用静态方法 - 不需要实例
console.log(MyClass.staticMethod()); // "这是一个静态方法"
// 调用实例方法 - 需要先创建实例
const instance = new MyClass();
console.log(instance.instanceMethod()); // "这是一个实例方法"
// 尝试通过实例调用静态方法会报错
// console.log(instance.staticMethod()); // TypeError
静态属性是类的属性,而不是实例的属性。它们用于存储与类相关的数据。
class User {
static role = '管理员'; // 静态属性
constructor(name) {
this.name = name; // 实例属性
}
}
console.log(User.role); // "管理员"
const user = new User('张三');
console.log(user.name); // "张三"
console.log(user.role); // undefined (静态属性不能通过实例访问)
Math
对象的方法this
在静态方法中,this
指向类本身,而不是实例:
class MyClass {
static staticMethod() {
return this === MyClass;
}
}
console.log(MyClass.staticMethod()); // true
class Circle {
static PI = 3.14159; // 静态属性
constructor(radius) {
this.radius = radius;
}
// 实例方法 - 计算面积
getArea() {
return Circle.PI * this.radius * this.radius;
}
// 静态方法 - 创建单位圆
static createUnitCircle() {
return new Circle(1);
}
// 静态方法 - 比较两个圆的大小
static compare(a, b) {
return a.radius - b.radius;
}
}
// 使用静态属性
console.log(Circle.PI); // 3.14159
// 使用静态方法创建实例
const unitCircle = Circle.createUnitCircle();
console.log(unitCircle.getArea()); // 3.14159
// 使用静态方法比较
const circle1 = new Circle(3);
const circle2 = new Circle(2);
console.log(Circle.compare(circle1, circle2)); // 1 (正数表示circle1更大)
静态成员非常适合用于与类相关但与实例无关的工具函数或常量。