类继承中的 ECMAScript 2018(ES9) private 关键字

ECMAScript 2018(也称为 ES9)是 JavaScript 的最新版本,它引入了许多新功能和改进,其中包括对类继承的支持。在 ES9 中,新增了 private 关键字,用于定义类的私有成员。本文将详细介绍私有成员以及如何在类继承中使用它们。

什么是私有成员?

在一个类中,通常会有一些成员只能在类内部使用,而不能被外部访问,这样的成员就被称为私有成员。

在 JavaScript 中,通常使用下划线(_)来表示私有成员,虽然这并不是一种官方的约定。例如,以下代码定义了一个名为 Person 的类,其中包含一个私有成员 _name:

class Person {
  constructor(name) {
    this._name = name; // 定义私有成员 _name
  }
  
  getName() {
    return this._name; // 在公共方法中访问私有成员 _name
  }
}

在这个例子中,_name 是 Person 类的私有成员,它只能被 getName() 方法访问,而不能被外部代码访问。

ES9 中的 private 关键字

ES9 中新增了一种定义私有成员的方式,即使用 private 关键字。使用 private 关键字定义的成员只能在类的内部访问,外部无法访问。以下是使用 private 关键字定义私有成员的代码示例:

class Person {
  constructor(name) {
    this.#name = name; // 定义私有成员 #name
  }
  
  getName() {
    return this.#name; // 在公共方法中访问私有成员 #name
  }
  
  #greet() { // 定义私有方法 #greet
    console.log(`Hello, ${this.#name}!`);
  }
  
  sayHello() {
    this.#greet(); // 在公共方法中调用私有方法 #greet
  }
}

在这个例子中,#name 是 Person 类的私有成员,只能在类的内部访问。#greet() 是私有方法,也只能在类的内部访问。sayHello() 方法调用了私有方法 #greet()。

需要注意的是,private 关键字只能用于 class 内部,不能用于 class 外部。也就是说,无法通过实例对象访问私有成员,也无法通过继承访问父类的私有成员。

在类继承中使用私有成员

在类继承中,私有成员通常需要被继承,否则子类无法访问父类的私有成员。ES9 中提供了一种解决方案,即使用 super 关键字访问父类的私有成员。以下是继承 Person 类并访问父类私有成员的代码示例:

class Employee extends Person {
  constructor(name, title) {
    super(name); // 调用父类的构造函数
    this.#title = title; // 定义私有成员 #title
  }
  
  getTitle() {
    return this.#title; // 在公共方法中访问私有成员 #title
  }
  
  introduce() {
    console.log(`My name is ${this.#name}, and I'm a ${this.#title}.`); // 访问父类的私有成员 #name
    this.#greet(); // 调用父类的私有方法 #greet
  }
}

在这个例子中,Employee 类继承了 Person 类,并定义了一个私有成员 #title。introduce() 方法通过 super 关键字访问了父类的私有成员 #name 和私有方法 #greet()。

需要注意的是,子类无法直接访问父类私有成员,而是需要通过父类提供的公共方法或 super 关键字来访问。因此,在类设计时需要考虑如何提供公共接口,以便子类能够访问父类的私有成员。

总结

在 ES9 中,private 关键字为类继承中的私有成员提供了一种新的定义方式,它比传统的下划线约定更加规范和语义化。使用 private 关键字可以将私有成员定义在类的内部,并通过继承和 super 关键字访问父类的私有成员。需要注意的是,私有成员只能在类的内部访问,外部无法访问。

有了私有成员,类的设计变得更加灵活和可维护。合理地使用私有成员可以保护类的内部状态,避免外部代码的干扰。同时,它也提高了代码的可复用性和可扩展性,使得类的继承更加方便和自然。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/659f8ebcadd4f0e0ff82183c


纠错反馈