ES6 class 中的 static 关键字和私有字段(#)怎么用?
请说明 ES6 class 中 static 方法/属性、私有字段(#)和私有方法的用法。
回答
苦行僧
static 静态成员:
class MathUtil {
static PI = 3.14159; // 静态属性(ES2022)
static add(a, b) { return a + b; } // 静态方法
}
MathUtil.PI; // 3.14159
MathUtil.add(1, 2); // 3
- 静态成员属于类本身,不属于实例
- 静态方法中 this 指向类本身
- 静态方法不能通过实例调用
- 子类可以通过
super访问父类的静态方法
私有字段(#):
class Person {
#name; // 私有字段声明(ES2022)
#age;
constructor(name, age) {
this.#name = name;
this.#age = age;
}
#privateMethod() { // 私有方法
return `${this.#name} is ${this.#age}`;
}
getInfo() { return this.#privateMethod(); }
static isPerson(obj) {
// 静态方法中检查私有字段
return #name in obj;
}
}
- 私有字段使用
#前缀,真正的硬私有(运行时强校验) - 私有字段不能在类外部访问
- 私有方法同样以
#开头 - 支持
#name in obj检查私有字段是否存在(Ergonomic brand checks)
对比 WeakMap 方案:# 是语法级别的私有,比 WeakMap 方案更简洁高效。