Javascript - 类的私有字段Private Field

在以前版本的JavaScript,实现类私有的私有字段是很麻烦的,各种写法层出不穷,有用闭包加一层的,有用Symbol类型实现的,反正每种方式看起来都怪怪的,不像别的语言Java, C#,甚至Typescript看起来那么舒服。

现在ES2022给出了一个新的标准来实现私有字段,虽然跟别的语言还不太一样,但总算也是给出了一种标准的解决方案。类属性在默认情况下是公有的,ES2022 允许您为类定义私有字段。 要定义私有字段,请在字段名称前加上 # 符号。即 # 是名称本身的一部分,声明和访问时也需要加上。

我们来看一个例子:

在这个例子中:

  • 首先,在类体中定义私有字段#radius。
  • 其次,使用参数初始化构造函数中的#radius 字段。
  • 第三,通过访问getter方法中的#radius私有字段来计算圆的面积。

下面创建 Circle 类的新实例并计算其面积:

因为#radius 是一个私有字段,所以您只能在 Circle 类中访问它。 换句话说,#radius 字段在 Circle 类之外是不可见的。

使用 getter 和 setter 访问私有字段

下面通过添加半径 getter 和 setter 重新定义 Circle 类,以提供对 #radius 私有字段的访问:

  • 半径setter在将参数分配给#radius 私有字段之前验证参数。 如果参数不是正数,则抛异常。
  • radius getter 返回#radius 私有字段的值。
  • 构造函数调用半径setter将参数分配给#radius 私有字段。

私有字段和子类

私有字段只能在定义它们的类中访问。 此外,它们不能从子类中访问。 例如,以下定义了扩展 Circle 类的 Cylinder 类:

如果你试图这样做,会收到错误提示:属性 '#radius' 在类 'Circle' 之外不可访问,因为是私有的。

再有,私有静态方法也不能通过子类访问,如下也会报错:


in 运算符:检查私有字段是否存在

静态私有字段

以下示例显示了如何使用静态私有字段,统计创建Circle实例的数量:

它是怎么工作的:

  • 首先,在 Circle 类中添加一个私有静态字段 #count 并将其值初始化为零。
  • 其次,在构造函数中将#count 加一。
  • 第三,定义一个返回#count私有静态字段值的静态方法。
  • 最后,创建 Circle 类的两个实例,并将计数值输出到控制台。

总结:

  1. 在字段名称前加上 # 符号以使其私有。
  2. 私有字段只能在字段的声明类内部访问,不能从类或子类的外部访问。
  3. 使用 in 运算符检查对象是否具有私有字段。
  4. 静态方法跟静态字段有同样的限制规则。

感谢阅读!

发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章