JavaScript中class的静态属性用static声明、属类本身,私有属性用#前缀、仅类内可访问;二者语法、作用域、访问规则均不同,不可混用。

JavaScript 中 class 的静态属性和私有属性是两类完全不同的成员,声明方式、作用域和访问规则都不同。掌握它们的写法,是写出结构清晰、封装良好的类的关键。
静态属性:用 static 关键字声明,属于类本身
静态属性不随实例创建而重复生成,它只有一份,直接挂载在类名上。
- 语法:在类体内用
static开头,后接属性名和初始值(可选) - 不能通过
this或实例访问,只能用ClassName.propertyName调用 - 常见用途包括常量定义、工具配置、全局计数器等
示例:
class ApiClient {
static baseUrl = 'https://api.example.com';
static timeout = 5000;
constructor(path) {
this.path = path;
}
}
console.log(ApiClient.baseUrl); // 'https://api.example.com'
// console.log(new ApiClient('/users').baseUrl); // undefined
私有属性:用 # 前缀声明,仅限类内部访问
私有属性由 JavaScript 引擎强制保护,外部无法读取、修改或检测其存在,连 in 操作符和 Object.getOwnPropertyNames() 都不可见。
- 语法:属性名必须以
#开头,如#id、#cache - 必须在类体顶层声明(不能在方法里动态添加),支持初始化值
- 只能在同一个 class 的方法、getter/setter、构造函数中通过
this.#xxx访问
示例:
class User {
#id;
#token = null;
constructor(id) {
this.#id = id; // 合法:类内初始化
}
login() {
this.#token = 'abc123'; // 合法:类内赋值
}
getId() {
return this.#id; // 合法:类内读取
}
}
const u = new User(1001);
console.log(u.getId()); // 1001
// console.log(u.#token); // SyntaxError:外部不可访问
注意:两者不能混用,也不能省略关键字或符号
静态私有属性是存在的,但需同时满足两个条件:加 static + 加 #,且只能在类内通过 ClassName.#xxx 访问。
- 错误写法:
static id = 1(这是静态公有属性);#id = 1(缺少static就是实例私有) - 正确写法:
static #counter = 0,然后在类内用User.#counter++ -
#是语法硬性要求,不是命名约定,不能用字符串拼接或方括号访问(this['#id']无效)


















