ECMAScript 2018(也称为 ES9)是 JavaScript 的最新版本,它引入了许多新功能和改进,其中包括对类继承的支持。在 ES9 中,新增了 private 关键字,用于定义类的私有成员。本文将详细介绍私有成员以及如何在类继承中使用它们。
什么是私有成员?
在一个类中,通常会有一些成员只能在类内部使用,而不能被外部访问,这样的成员就被称为私有成员。
在 JavaScript 中,通常使用下划线(_)来表示私有成员,虽然这并不是一种官方的约定。例如,以下代码定义了一个名为 Person 的类,其中包含一个私有成员 _name:
-- -------------------- ---- ------- ----- ------ - ----------------- - ---------- - ----- -- ------ ----- - --------- - ------ ----------- -- ------------ ----- - -
在这个例子中,_name 是 Person 类的私有成员,它只能被 getName() 方法访问,而不能被外部代码访问。
ES9 中的 private 关键字
ES9 中新增了一种定义私有成员的方式,即使用 private 关键字。使用 private 关键字定义的成员只能在类的内部访问,外部无法访问。以下是使用 private 关键字定义私有成员的代码示例:
-- -------------------- ---- ------- ----- ------ - ----------------- - ---------- - ----- -- ------ ----- - --------- - ------ ----------- -- ------------ ----- - -------- - -- ------ ------ ------------------- ----------------- - ---------- - -------------- -- ------------ ------ - -
在这个例子中,#name 是 Person 类的私有成员,只能在类的内部访问。#greet() 是私有方法,也只能在类的内部访问。sayHello() 方法调用了私有方法 #greet()。
需要注意的是,private 关键字只能用于 class 内部,不能用于 class 外部。也就是说,无法通过实例对象访问私有成员,也无法通过继承访问父类的私有成员。
在类继承中使用私有成员
在类继承中,私有成员通常需要被继承,否则子类无法访问父类的私有成员。ES9 中提供了一种解决方案,即使用 super 关键字访问父类的私有成员。以下是继承 Person 类并访问父类私有成员的代码示例:
-- -------------------- ---- ------- ----- -------- ------- ------ - ----------------- ------ - ------------ -- --------- ----------- - ------ -- ------ ------ - ---------- - ------ ------------ -- ------------ ------ - ----------- - --------------- ---- -- -------------- --- --- - ------------------ -- --------- ----- -------------- -- --------- ------ - -
在这个例子中,Employee 类继承了 Person 类,并定义了一个私有成员 #title。introduce() 方法通过 super 关键字访问了父类的私有成员 #name 和私有方法 #greet()。
需要注意的是,子类无法直接访问父类私有成员,而是需要通过父类提供的公共方法或 super 关键字来访问。因此,在类设计时需要考虑如何提供公共接口,以便子类能够访问父类的私有成员。
总结
在 ES9 中,private 关键字为类继承中的私有成员提供了一种新的定义方式,它比传统的下划线约定更加规范和语义化。使用 private 关键字可以将私有成员定义在类的内部,并通过继承和 super 关键字访问父类的私有成员。需要注意的是,私有成员只能在类的内部访问,外部无法访问。
有了私有成员,类的设计变得更加灵活和可维护。合理地使用私有成员可以保护类的内部状态,避免外部代码的干扰。同时,它也提高了代码的可复用性和可扩展性,使得类的继承更加方便和自然。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/659f8ebcadd4f0e0ff82183c