ECMAScript 2020 (ES11):如何使用 private field 实现对象 - oriented 编程

随着前端技术的不断发展,JavaScript 的语言特性也在不断更新。ECMAScript 2020 (ES11) 是 JavaScript 的最新版本,其中一个重要的新特性就是 private field,它为 JavaScript 提供了面向对象编程的新方式。本文将介绍如何使用 private field 实现对象 - oriented 编程,并提供示例代码。

什么是 private field?

在 JavaScript 中,对象的属性和方法通常都是公开的,也就是说,它们可以被任何代码访问和修改。但是,有时候我们希望某些属性和方法只能在对象内部使用,而不能被外部代码访问和修改。这就是 private field 的作用。

在 ES11 中,我们可以使用 # 符号来定义一个私有属性。例如:

class MyClass {
  #privateField = 42;
}

在这个例子中,我们定义了一个名为 #privateField 的私有属性,它的初始值为 42。注意,私有属性的名字必须以 # 符号开头。

如何访问 private field?

由于私有属性不能被外部代码访问,因此我们需要使用特殊的方法来访问它们。在 ES11 中,我们可以使用 getter 和 setter 方法来访问私有属性。

例如,我们可以定义一个 getter 方法来获取私有属性的值:

class MyClass {
  #privateField = 42;

  getPrivateField() {
    return this.#privateField;
  }
}

在这个例子中,我们定义了一个名为 getPrivateField 的方法,它返回私有属性 #privateField 的值。

类似地,我们也可以定义一个 setter 方法来设置私有属性的值:

class MyClass {
  #privateField = 42;

  setPrivateField(value) {
    this.#privateField = value;
  }
}

在这个例子中,我们定义了一个名为 setPrivateField 的方法,它将传入的值设置为私有属性 #privateField 的值。

需要注意的是,私有属性只能在对象内部使用,因此 getter 和 setter 方法也必须在对象内部定义。

如何使用 private field 实现对象 - oriented 编程?

使用 private field,我们可以更轻松地实现对象 - oriented 编程。例如,我们可以定义一个类来表示一个人:

class Person {
  #name;
  #age;

  constructor(name, age) {
    this.#name = name;
    this.#age = age;
  }

  getName() {
    return this.#name;
  }

  getAge() {
    return this.#age;
  }

  setAge(age) {
    this.#age = age;
  }
}

在这个例子中,我们定义了一个名为 Person 的类,它有两个私有属性 #name#age,分别表示人的姓名和年龄。我们还定义了一个构造函数来初始化这两个属性。类中还有三个方法,分别用于获取姓名、获取年龄和设置年龄。

使用这个类,我们可以创建一个人对象并访问它的私有属性:

const person = new Person('张三', 18);
console.log(person.getName()); // 输出:张三
console.log(person.getAge()); // 输出:18
person.setAge(19);
console.log(person.getAge()); // 输出:19

由于 #name#age 是私有属性,因此外部代码不能直接访问它们。但是,我们可以使用 getter 和 setter 方法来访问它们,从而实现了对象 - oriented 编程。

总结

私有属性是 ES11 中的一个重要特性,它为 JavaScript 提供了面向对象编程的新方式。使用 private field,我们可以更轻松地实现对象 - oriented 编程,从而编写更加模块化和可维护的代码。在实际开发中,我们可以根据需要使用 private field 来保护对象的属性和方法,提高代码的安全性和可靠性。

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