es6 class支持静态方法和静态属性,属于类本身而非实例,需通过类名调用;静态方法用static声明,不可访问实例this;静态属性自es2022起直接支持static声明;子类可继承并重写静态成员,this指向当前类。

ES6 的 class 语法支持静态方法和静态属性,它们属于类本身,而不是类的实例,因此不能通过 new MyClass() 创建的实例访问,只能直接通过类名调用或访问。
静态方法怎么声明
使用 static 关键字定义静态方法,它可以直接在类上被调用,常用于工具函数、工厂方法或与类逻辑相关但不依赖实例状态的操作。
- 语法:在方法名前加
static - 不能访问
this(指向类本身,不是实例;若需访问类,可用类名或constructor) - 常见用途:创建实例的快捷方式(如
fromJSON)、数据校验、通用计算
示例:
class MathUtils {
static add(a, b) {
return a + b;
}
static multiply(a, b) {
return a * b;
}
}
<p>MathUtils.add(2, 3); // 5
MathUtils.multiply(4, 5); // 20
// new MathUtils().add(); // TypeError: not a function
</p>
静态属性怎么声明(ES2022 起正式支持)
静态属性也用 static 声明,写在类体内部,位于方法或字段之前。注意:早期需靠赋值语句模拟(如 MyClass.prop = value),现在可直接声明。
- 支持初始化表达式,包括函数、对象、基本类型等
- 不可在构造函数中重复定义(会覆盖,但不推荐)
- 适合存放常量、默认配置、共享缓存等
示例:
class ApiClient {
static baseUrl = 'https://www.php.cn/link/710ba53b0d353329706ee1bedf4b9b39';
static defaultTimeout = 5000;
static endpoints = {
users: '/users',
posts: '/posts'
};
}
<p>console.log(ApiClient.baseUrl); // '<a href="https://www.php.cn/link/710ba53b0d353329706ee1bedf4b9b39">https://www.php.cn/link/710ba53b0d353329706ee1bedf4b9b39</a>'
console.log(ApiClient.endpoints.users); // '/users'
</p>
静态成员的继承与重写
子类会继承父类的静态方法和静态属性,也可通过同名 static 成员进行覆盖。
- 子类中重写静态方法时,
this指向的是当前子类(实现多态) - 可通过
super.方法名调用父类静态方法 - 静态属性不会自动“继承并合并”,而是完全替换
示例:
class Animal {
static kingdom = 'Animalia';
static describe() {
return `Kingdom: ${this.kingdom}`;
}
}
<p>class Mammal extends Animal {
static kingdom = 'Animalia (Mammalia)';
static describe() {
return super.describe() + ' — Mammal';
}
}</p><p>Animal.describe(); // 'Kingdom: Animalia'
Mammal.describe(); // 'Kingdom: Animalia (Mammalia) — Mammal'
</p>
注意事项和常见误区
静态成员看似简单,但容易混淆作用域和调用方式。
- 静态方法里不能访问实例属性(如
this.name),因为没有实例上下文 - 类字段提案(public/private 字段)中,
static #privateField是合法的私有静态成员(需现代环境支持) - Babel 或旧环境可能不支持顶层静态属性,需启用
@babel/preset-env并设置目标浏览器 - 不要把本该是实例方法的逻辑误写成静态方法(比如需要访问
this.id的操作)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











