如何在 ES9 中创建具有私有属性的类

在 ES9,也就是 ECMAScript 2018 中,JavaScript 支持了一个新特性——私有属性。私有属性指的是类的属性只能在类内部访问,外部访问时会报错。这个特性在实际开发中非常实用,可以避免不小心修改了其他开发者不希望被修改的属性。

下面我们来介绍如何在 ES9 中创建具有私有属性的类。

使用井号(#)来定义私有属性

在 ES9 中,可以使用井号(#)来定义私有属性。它只能出现在 class 中,并且在属性名前加上井号即可:

----- ------ -
  ------

  ----------------- -
    ---------- - -----
  -

  --- ------ -
    ------ -----------
  -
-

在上面的例子中,我们定义了一个 Person 类,它有一个私有属性 #name。构造函数接收一个参数 name,并将其设置为私有属性的值。我们还定义了一个 name 的 getter 方法,它返回私有属性 #name

注意,私有属性的名称必须以井号(#)开头,否则会被认为是普通公有属性。

访问私有属性

私有属性只能在类内部访问。在类的方法中,可以直接访问私有属性。在类外部,访问私有属性会报错:

----- ------ - --- --------------
------------------------- -- -- -----

-------------------------- -- --------------- ------- ----- ------- ---- -- -------- -- -- --------- -----

在上面的例子中,我们首先实例化了 Person 类,并调用了 name getter 方法,输出了 Tom。然后,我们尝试直接访问私有属性 #name,结果会报错。

使用 WeakMap 来实现私有属性

在 ES9 之前,我们也可以实现类似的私有属性功能。一种常用的方法是使用闭包和 WeakMap。

----- ------ - ----------- -
  ----- ------------ - --- ----------

  ----- ------ -
    ----------------- -
      ---------------------- - ---- ---
    -

    --- ------ -
      ------ ----------------------------
    -
  -

  ------ -------
-----

在上面的例子中,我们使用了一个闭包来创建一个私有的 WeakMap 对象,用于存储私有属性。在构造函数中,我们使用 privateProps.set 方法来设置私有属性。在 name getter 方法中,我们使用 privateProps.get 方法来获取私有属性。

使用 WeakMap 实现私有属性的主要缺点是需要额外的内存空间,而且代码相对繁琐。在 ES9 中,使用井号(#)定义私有属性更加简单清晰,也可以避免一些可能出现的问题,推荐使用。

结论

在 ES9 中,我们可以使用井号(#)来定义私有属性。私有属性只能在类的内部访问,外部访问会报错。使用私有属性可以更加精细地控制类的状态,避免意外修改。我们还可以使用闭包和 WeakMap 在 ES9 之前实现类似的功能,不过相对更加繁琐。

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