ES12 中的私有变量和方法

阅读时长 4 分钟读完

在过去,JavaScript 中并没有“真正”的私有变量或方法。然而,ECMAScript 2019(也称为 ES12)为开发者们带来了新的功能,相信您将感到非常兴奋,因为 ES12 具有私有变量和方法的支持。本文将重点介绍 ES12 中的私有变量和方法,并提供示例代码,帮助您了解如何使用它们。

什么是私有变量和方法?

在面向对象编程(OOP)中,私有变量和方法是指可以被对象内部访问,但不能被外部代码访问的属性和方法。这意味着只有对象本身才能访问这些属性和方法,而无法通过对象的实例或对象本身之外的另一个东西访问它们。

ES12 中的私有变量

ES12 中有两种方法来创建私有变量:

1. 使用 # 前缀

在 ES12 中,您可以使用 # 前缀来定义私有变量,即在变量名前加上 # 前缀。

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

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

在上面的示例代码中,我们创建了一个名为 Person 的类,并定义了一个名为 #name 的私有变量。我们还创建了一个 getter 和 setter 方法来获取和设置 #name 的值。

2. 使用 WeakMap

除了 # 前缀之外,ES12 还支持使用 WeakMap 来创建私有变量。要使用 WeakMap 来创建私有变量,请使用以下代码:

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

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

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

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

在上面的示例代码中,我们创建了一个名为 _nameWeakMap,并在 constructor 方法中使用了它。我们还创建了一个名为 getName 的方法来获取 name 的值。

需要注意的是,WeakMap 中的键是对象,这意味着您必须使用对象来访问相应的值。如果没有提供这个对象,您将无法访问这个值。这就是为什么 [_name].get(this) 将返回 undefined

ES12 中的私有方法

在 ES12 中,您可以使用 # 前缀来创建私有方法,方法名前加上 # 前缀即可。这与创建私有变量时的方式相同。

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

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

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

在上面的示例代码中,我们创建了一个名为 MyClass 的类,并定义了一个名为 #privateMethod 的私有方法。我们还定义了一个名为 publicMethod 的公共方法,通过 publicMethod 方法可以访问私有方法 #privateMethod

结论

ES12 中的私有变量和方法为 JavaScript 中开发者带来了更加灵活的编程方式。使用 # 前缀或 WeakMap,您可以轻松地创建私有变量和方法,并可以确保对象本身才是唯一可以访问这些属性或方法的对象。

值得注意的是,私有变量和方法不能被继承类访问,但是子类可以覆盖它们。这就是为什么私有变量和方法被称为“私有”的原因。它们只能在对象内部使用,而不能在对象之外访问。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67301e84eedcc8a97c911e59

纠错
反馈