JavaScript 中的 static 关键字用于声明静态属性和方法,属于类本身而非实例,通过类名直接访问;静态属性在类定义时初始化,不可通过 this 访问,不参与实例继承,且不可枚举。

JavaScript 中的 static 关键字用于在类内部声明**静态属性和静态方法**,它们属于类本身,而不是类的实例。也就是说,静态成员通过类名直接访问,无需创建实例。
静态属性的基本写法
在类体中使用 static 修饰符 + 属性名即可声明静态属性:
- 静态属性在类定义时初始化(只执行一次)
- 不能在构造函数或实例方法中用
this.staticProp访问 - 必须通过
ClassName.staticProp或Class.staticProp(ES2022 起支持类字段语法)访问
示例:
class MathUtils {
static PI = 3.14159;
static MAX_VALUE = Number.MAX_SAFE_INTEGER;
constructor(value) {
this.value = value;
}
}
console.log(MathUtils.PI); // 3.14159
console.log(MathUtils.MAX_VALUE); // 9007199254740991
console.log(new MathUtils(10).PI); // undefined(实例上没有该属性)
静态属性与实例属性的区别
关键区别在于归属和访问方式:
- 静态属性:属于类,所有实例共享一份,通过类名访问
- 实例属性:属于每个对象,通过
this在构造函数或实例方法中定义,每个实例独立拥有
错误写法(常见误区):
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
class Counter {
static count = 0;
constructor() {
this.count++; // ❌ 这是在实例上创建新属性,不是修改静态 count
}
}
正确做法是显式访问类名:
class Counter {
static count = 0;
constructor() {
Counter.count++; // ✅ 明确修改静态属性
}
}
静态属性的初始化时机和限制
静态属性在类定义被求值时立即初始化(类似模块顶层变量),但有几点要注意:
- 不能在静态属性初始化表达式中引用尚未声明的静态属性(顺序敏感)
- 不支持私有静态属性的简写语法(
static #privateProp是合法的,但需配合私有字段语法) - 若需复杂初始化(如调用函数、异步逻辑),建议改用静态 getter 或在类外赋值
例如使用静态 getter 延迟计算:
class Config {
static get API_URL() {
return process.env.NODE_ENV === 'production'
? 'https://api.example.com'
: 'http://localhost:3000';
}
}
console.log(Config.API_URL); // 自动执行 getter
兼容性与现代写法补充
静态属性字段(如 static prop = value)是 ES2022 正式特性,在主流浏览器和 Node.js 16+ 中已广泛支持。若需兼容旧环境,可用以下替代:
- 类定义后手动赋值:
MyClass.staticProp = value; - 用静态 getter 模拟(适合只读场景)
- 避免在静态属性中依赖未定义的全局变量或运行时上下文
不复杂但容易忽略:静态属性不可枚举,也不会出现在 for...in 循环或 Object.keys() 结果中。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










