在ES7之前,Javascript是没有私有成员或私有方法的概念的。然而,在ES6中,引入了一些新的特性,如类和模块,这为创建私有成员和方法奠定了基础。在ES7中,Javascript引入了对私有名称的支持,因此,我们可以在我们的代码中使用私有成员和方法。
私有名称
在json对象中,我们可以使用下划线 _ 开头来表示私有属性,但是这样的做法并不能真正地把属性保护起来。ES7中的私有名称并不是真正的私有属性,而是使属性名以 # 开头的特殊标记。这样的属性不会出现在枚举中,因此从外部无法访问和修改。例如:
class Student { #name = 'Tom'; getName() { return this.#name; } } let student = new Student(); console.log(student.#name); // Uncaught SyntaxError: Private field '#name' must be declared in an enclosing class console.log(student.getName()); // Tom
在这个例子中,我们创建了一个名为 Student 的类,并在其中定义了一个私有属性 #name。我们也定义了一个公共方法 getName(),用于访问私有字段 #name。然后我们创建一个新的 Student 对象,并尝试访问私有字段 #name,但它们将导致 Uncaught SyntaxError。但我们可以使用公共方法 getName() 来访问 #name。这为我们实现了真正的私有成员和方法提供了强大的工具。
为什么要使用私有名称
那么,为什么我们要使用私有名称呢?为什么不能直接访问属性或方法?答案是封装。封装是面向对象编程的一个重要的概念。它使我们可以把类的实现细节隐藏在我们代码的外面,只暴露出一些出口供外部代码调用。这提高了代码的可维护性和可扩展性。使用私有名称可以更好地实现封装。我们可以在类的实现内部维护私有成员和方法,只提供公共方法来访问这些私有成员和方法。
使用私有名称
在使用私有名称时,有几个需要注意的地方。首先,私有名称必须在类的内部声明。使用私有名称的语法是在属性名前加一个 # 符号。如:
class Foo { #bar; constructor(bar) { this.#bar = bar; } getBar() { return this.#bar; } }
在这个例子中,我们声明了一个私有成员 #bar, 并在构造函数中初始化它。我们也定义了一个公共方法 getBar(),用于访问私有成员 #bar,在这个示例中,我们只提供了一个 getBar() 方法来访问私有成员 #bar。
总结
ES7 引入了对特定类成员和方法的支持,使我们能够更好地实现封装。使用私有名称可以使类的实现细节更好地隐藏在我们代码的外面。私有名称也提高了代码的可维护性和可扩展性。使用私有名称的语法是在属性名前加一个 # 符号。注意,私有名称必须在类的内部声明。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65b49a1eadd4f0e0ffd7f6ec