实现 JavaScript 真正的 OOP——探寻 ECMAScript 2021 (ES12) 中的 private 属性

阅读时长 5 分钟读完

JavaScript 一直被认为是一门弱类型语言,缺少了传统程序语言中的 OOP(面向对象编程)特性,这也导致了在编写大型应用程序时,往往需要考虑到对象的可变性问题,难以保证程序的安全性和数据的完整性。ECMAScript 2015(ES6)的发布引入了类的概念,这使得 JavaScript 更加符合 OOP 的语言风格,使得大量面向对象编程的应用能够更简便地在 JavaScript 中实现。

然而,ES6 中的 class 存在一些问题,最主要的是类中属性和方法的可见性问题,即在类中定义的属性和方法都是公共的,而不具有私有化的特性。ES2021(ES12)中,新增了 private 属性和方法的支持,使得 JavaScript 真正具有了 OOP 中的封装特性,解决了类中的可见性问题,本文将为你详细介绍 ES12 中 private 属性的使用。

定义私有属性

在 ES12 中,我们可以通过在属性名前面添加井号 # 来定义私有属性,这样一来,无论是继承还是实例化,都无法或只能有限地访问私有属性。下面是一个简单的例子:

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

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

在这个例子中,我们定义了一个 Person 类,其中包含一个私有属性 #name。在构造函数中,我们对 #name 进行了赋值,而在 getName 方法中,我们返回了这个私有属性的值。值得注意的是,当我们进行实例化并调用 getName 方法时,是可以得到正确的值的,而当我们试图直接访问 #name 属性时,却会抛出 SyntaxError,这是因为私有属性只能在类内部访问。

定义私有方法

ES12 中的 private 属性不仅限于属性,它也可以用于定义私有方法,与属性定义方式相同,只需在方法名前面添加井号 # 即可:

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

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

在这个例子中,我们定义了一个私有方法 #setName,它用于对私有属性 #name 进行赋值。在 changeName 方法中,我们调用了 #setName 方法来改变实例 john 的私有属性 #name 的值。同样地,当我们试图直接调用 #setName 方法时,会抛出 SyntaxError,而调用 changeName 方法却是有效的。

可继承的私有属性和方法

除了私有属性和方法的定义,ES12 的 private 属性还支持继承,即在父类中定义的私有属性和方法可以被子类继承和使用。下面是一个继承私有属性和方法的例子:

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

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

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

在这个例子中,我们定义了一个 Person 类和一个 Employee 类,其中 Employee 是 Person 的子类。在 Person 类中,我们定义了一个私有方法 #setId,而在 Employee 类中,我们使用了 super.#setId 方法,这样就可以在 Employee 实例中继承到父类中的私有方法 #setId。

总结

我们了解了 ES12 中的 private 属性及其用法,私有化的特性使得 JavaScript 更加符合传统 OOP 的语言风格,在编写大型应用程序时,可以更加方便地保证程序的安全性和数据的完整性。当然,在实际应用中,开发者还需要综合考虑私有化和对外开放的需求,权衡二者之间的利弊,才能更好地运用这一特性。

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

纠错
反馈