ES6私有方法通过#号定义,仅限同类内部调用,不可被外部、子类或借调访问,静态私有方法需用static #声明且仅限类内调用。

ES6 类中私有方法的“内部保护调用”,核心在于确保该方法**只能被同一个类的其他成员(公有/私有方法)调用,而无法从类外部、子类或任何其他上下文直接访问**。这种保护不是靠运行时拦截,而是由 JavaScript 引擎在语法和语义层面强制执行的。
用 # 号定义,天然受语法级保护
ES2022 起正式支持的私有方法,必须以 # 开头声明,且只能在声明它的 class 内部通过 this.#methodName() 调用:
- 写法合法:在 constructor、公有方法、其他私有方法里,都可用
this.#xxx()调用 - 写法非法:类外部(包括实例上、继承链中、Reflect、for...in、Object.keys 等)均无法访问或调用
#xxx - 报错明确:尝试
obj.#xxx()或obj.#xxx会直接抛出SyntaxError或TypeError,不是静默失败
不能被子类继承或覆盖
私有方法不参与原型链,也不出现在子类作用域中:
- 子类无法通过
super.#xxx()调用父类私有方法(语法错误) - 子类定义同名
#xxx是完全独立的新私有方法,与父类无任何关系 - 这和 Java/C# 中的
private行为一致——真正隔离,而非“受保护”(protected)
调用时 this 指向必须是当前类实例
私有方法只能绑定到当前类的实例上调用,不支持借调(call/apply)到其他对象:
立即学习“Java免费学习笔记(深入)”;
-
this.#xxx.call(anotherObj, ...)或xxx.call(instance, ...)全部报错 - 引擎会检查调用者是否为声明该私有方法的类的实例,否则拒绝执行
- 这意味着你无法像模拟私有方法那样用函数外置 + call 来绕过限制
静态私有方法需用 static # 修饰
如果需要类级别的私有逻辑(不依赖实例),可定义静态私有方法:
- 写法:
static #helper() { ... } - 调用方式:
MyClass.#helper()(仅限类内部,比如在 static 方法里) - 同样不可被外部访问,也不属于实例,不能用
this.constructor.#helper()动态调用


















