在 JavaScript 中,对象的属性(包括方法)都是公开的,即可以被外部访问和修改。在某些情况下,我们希望某些属性或方法只能在对象内部使用,不希望被外部访问或修改,这就是私有属性和方法的概念。ES9(即 ECMAScript 2018)中引入了私有字段(Private Fields)的概念,让我们可以更方便地创建私有属性和方法。
定义私有字段
ES9 中,我们可以使用 #
符号来定义私有字段。例如,下面的代码定义了一个名为 Person
的类,其中包含一个私有字段 #name
和一个公开方法 getName()
:
// javascriptcn.com 代码示例 class Person { #name; constructor(name) { this.#name = name; } getName() { return this.#name; } } const p = new Person('Tom'); console.log(p.getName()); // 输出:Tom console.log(p.#name); // 报错:SyntaxError: Private field '#name' must be declared in an enclosing class
在上面的代码中,我们使用 #name
定义了一个私有字段,它只能在 Person
类内部使用。在类的构造函数中,我们可以通过 this.#name
来给私有字段赋值。在公开方法 getName()
中,我们可以通过 this.#name
来访问私有字段的值。注意,私有字段不能在类的外部访问,否则会报错。
私有字段的特点
私有字段有以下几个特点:
- 私有字段只能在类的内部访问,不能在类的外部访问。
- 私有字段不能被继承。
- 私有字段可以与公开字段同名,不会发生冲突。
下面的代码演示了私有字段的第二个特点:
// javascriptcn.com 代码示例 class Person { #name = 'Tom'; } class Student extends Person { constructor() { super(); console.log(this.#name); // 报错:SyntaxError: Private field '#name' must be declared in an enclosing class } } const s = new Student();
在上面的代码中,我们定义了一个名为 Person
的类,其中包含一个私有字段 #name
。然后,我们定义了一个名为 Student
的子类,它继承自 Person
。在 Student
的构造函数中,我们尝试访问 #name
,结果会报错。这是因为私有字段不能被继承。
私有字段的应用
私有字段的应用场景很多,例如:
- 封装数据,防止外部直接访问和修改。
- 隐藏实现细节,提高代码安全性和可维护性。
- 避免字段名冲突,提高代码可读性。
下面的代码演示了私有字段的第一个应用场景:
// javascriptcn.com 代码示例 class Point { #x; #y; constructor(x, y) { this.#x = x; this.#y = y; } setX(x) { this.#x = x; } setY(y) { this.#y = y; } getX() { return this.#x; } getY() { return this.#y; } } const p = new Point(1, 2); console.log(p.getX()); // 输出:1 console.log(p.getY()); // 输出:2 p.setX(3); p.setY(4); console.log(p.getX()); // 输出:3 console.log(p.getY()); // 输出:4 console.log(p.#x); // 报错:SyntaxError: Private field '#x' must be declared in an enclosing class
在上面的代码中,我们定义了一个名为 Point
的类,其中包含两个私有字段 #x
和 #y
,表示点的横坐标和纵坐标。在类的构造函数中,我们可以通过 this.#x
和 this.#y
来给私有字段赋值。在公开方法 setX()
和 setY()
中,我们可以通过 this.#x
和 this.#y
来修改私有字段的值。在公开方法 getX()
和 getY()
中,我们可以通过 this.#x
和 this.#y
来访问私有字段的值。注意,私有字段不能在类的外部访问,否则会报错。
总结
ES9 中的私有字段为我们提供了一种更方便、更安全、更可维护的封装方式。通过定义私有字段,我们可以更好地控制数据的访问和修改,避免因字段名冲突而导致的错误,提高代码的可读性和可维护性。在实际开发中,我们可以根据需要使用私有字段来优化代码的设计和实现。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/657e6f11d2f5e1655d943467