在 JavaScript 中,尤其是在使用现代 JavaScript 类(ES6+)的上下文中,public
、private
和 protected
是用来定义类成员(属性和方法)的访问控制级别的关键字。以下是它们的详细说明及区别:
1. Public(公开)
- 定义:
public
是默认的访问控制修饰符,表示该成员可以在任何地方访问。 - 访问方式:可以从类的内部、外部、子类及实例访问。
- 表示方式:在 ES6 中,所有类的成员默认都是
public
,并且在类中定义时没有特殊标记。
class Example {
publicMethod() {
console.log("This is a public method.");
}
}
const example = new Example();
example.publicMethod(); // 可以访问
2. Private(私有)
- 定义:
private
用于定义私有成员,这些成员只能在类的内部访问,外部(包括子类)无法访问。 - 访问方式:只能在类的实例方法中访问,不能被类的外部代码或者子类访问。
- 表示方式:在 ES2022 及其之后,使用
#
符号来定义私有属性和方法。
class Example {
#privateMethod() {
console.log("This is a private method.");
}
publicMethod() {
this.#privateMethod(); // 可以访问
}
}
const example = new Example();
example.publicMethod(); // 可以访问
// example.#privateMethod(); // 报错:无法访问私有方法
3. Protected(受保护的)
- 定义:在 JavaScript 中,
protected
并不是一个标准的访问修饰符,但在 TypeScript 和某些类库(如某些 ES6 的实现)中可以找到类似的概念。protected
成员可以在类内部和派生类中访问,但不能独立于这些类访问。 - 访问方式:只能在类的内部或子类中访问,外部代码无法访问。
- 表示方式:在 JavaScript 中没有直接的语法来实现
protected
。实现受保护的成员通常是通过使用_
前缀(如_protectedMethod()
)来约定,但这并不是真正的protected
访问控制。
class Base {
_protectedMethod() {
console.log("This is a protected method.");
}
}
class Derived extends Base {
useProtectedMethod() {
this._protectedMethod(); // 子类可以访问
}
}
const derived = new Derived();
derived.useProtectedMethod(); // 可以访问
// derived._protectedMethod(); // 仍然无法从外部访问
总结
访问修饰符 | 访问范围 |
---|---|
Public | 任何地方(内部、外部、子类) |
Private | 仅在类内部, 可以通过公共方法访问 |
Protected | 仅在类内部和派生类内部 |
在 JavaScript 中,public
和 private
是直接支持的,而 protected
采用约定形式实现,通常依赖于命名约定。使用这些访问修饰符可以帮助更好地封装代码、隐藏实现细节以及提高数据安全性。