CodeWalk

ES6 class 中的 static 关键字和私有字段(#)怎么用?

作者:苦行僧 · 2026-05-30 12:55

请说明 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 方案更简洁高效。