在 ECMAScript 2020 (ES11) 中,新增了私有类成员(Private Class Elements)的特性,使得我们可以在类中定义私有属性和方法,这些属性和方法只能在类内部被访问,无法从外部访问,从而保证了类的封装性。
什么是私有类成员?
私有类成员是指在类内部定义的属性和方法,它们只能在类内部被访问,外部无法访问。在 ES11 中,我们可以通过在属性和方法前面添加 #
符号来定义私有类成员。例如:
// javascriptcn.com 代码示例 class Person { #name = 'Jack'; #sayHello() { console.log(`Hello, my name is ${this.#name}.`); } introduce() { this.#sayHello(); } } const person = new Person(); person.introduce(); // 输出:Hello, my name is Jack. person.#name; // 报错:SyntaxError: Private field '#name' must be declared in an enclosing class person.#sayHello(); // 报错:SyntaxError: Private field '#sayHello' must be declared in an enclosing class
在上面的代码中,我们定义了一个 Person
类,其中包含了一个私有属性 #name
和一个私有方法 #sayHello()
。在 introduce()
方法中,我们调用了 #sayHello()
方法,从而输出了 Hello, my name is Jack.
。
需要注意的是,当我们尝试在外部访问 #name
属性和 #sayHello()
方法时,会抛出 SyntaxError: Private field '#xxx' must be declared in an enclosing class
的错误,提示我们这是一个私有成员,无法在类外部访问。
私有类成员的作用
私有类成员的作用主要体现在以下两个方面:
1. 保护类的封装性
在面向对象编程中,封装是一种重要的编程思想,它可以将数据和行为封装在一起,形成一个独立的模块,从而提高代码的可维护性和可复用性。私有类成员可以帮助我们更好地实现类的封装,将一些敏感的数据和行为隐藏起来,避免外部对其进行非法访问和修改。
2. 避免命名冲突
在 JavaScript 中,全局作用域中的变量和函数容易被污染,特别是在大型项目中,命名冲突的问题会更加严重。私有类成员可以帮助我们避免命名冲突,因为它们只能在类内部被访问,不会与全局作用域中的变量和函数发生冲突。
私有类成员的语法
在 ES11 中,我们可以通过在属性和方法前面添加 #
符号来定义私有类成员。私有类成员的语法如下:
// javascriptcn.com 代码示例 class MyClass { #privateField; #privateMethod() { // ... } get #privateGetter() { // ... } set #privateSetter(value) { // ... } static #privateStaticField; static #privateStaticMethod() { // ... } static get #privateStaticGetter() { // ... } static set #privateStaticSetter(value) { // ... } }
其中,#
符号可以用于定义私有属性、私有方法、私有 getter、私有 setter、私有静态属性、私有静态方法、私有静态 getter 和私有静态 setter。
需要注意的是,私有类成员不能被继承,子类无法访问父类的私有成员。
私有类成员的实现原理
私有类成员的实现原理是通过名称修饰来实现的,即在类内部将私有成员的名称重新命名,使其无法从外部访问。例如,在上面的 Person
类中,私有属性 #name
的实际名称可能是 _Person#name
,私有方法 #sayHello()
的实际名称可能是 _Person#sayHello
。这样,当我们在类内部访问私有成员时,实际上是在访问经过名称修饰后的成员,而在类外部访问时,无法直接访问经过名称修饰的成员,从而达到了保护类的封装性的目的。
总结
私有类成员是 ECMAScript 2020 (ES11) 中新增的一个特性,它可以帮助我们更好地实现类的封装,避免外部对其进行非法访问和修改,同时也可以避免命名冲突。私有类成员的语法简单明了,通过在属性和方法前面添加 #
符号来定义私有成员。私有类成员的实现原理是通过名称修饰来实现的,即在类内部将私有成员的名称重新命名,使其无法从外部访问。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/655f19cbd2f5e1655d943e3d