使用 ES6 的 Symbol 对象实现私有成员的封装

阅读时长 3 分钟读完

在面向对象编程中,私有成员是类中不希望暴露出去的属性或方法。在传统的 JavaScript 中,通常通过约定“私有成员”的命名规则来实现。然而,这种实现方式容易被绕过,导致类的封装性受到破坏。ES6 引入了 Symbol 对象,可以更安全地实现私有成员的封装。

Symbol 对象

Symbol 对象是 ES6 中新增的一种基本数据类型,用于表示独一无二(唯一性)的值。每个 Symbol 值都是唯一的,由内部生成并暴露给外部使用。Symbol 值可以被用作对象属性的键名来保证不会出现重复。它的生成方式如下:

Symbol 对象还接受一个参数,用于描述 Symbol 值的含义。

用 Symbol 实现私有成员

通过将私有成员的键名设置为 Symbol 类型,我们可以将这些属性和方法真正地封装起来,即使开发者使用类的实例化对象也无法访问到这些属性和方法。下面是一个例子:

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

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

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

------------------------------ -- ------- ---------
-------------------------------- -- ------- ------
展开代码

在上面的代码中, _privateKey 变量是一个 Symbol 对象,被用作 Person 类的一个私有属性。在 constructor 中,我们将传入的 privateKey 参数赋值给 _privateKey

在 getInfo 方法中,我们暴露了 name 和 age 公开属性的取值方式,但私有属性并没有暴露。

在 getPassword 方法中,我们只在内部使用了 privateKey,绝不会通过实例化对象直接获取到。

意义和指导

使用 Symbol 对象实现私有成员,可以有效地保证了类的封装性,从而避免了类的属性和方法被误用或篡改。在应用开发中,对安全性要求较高的应用可以尤其受益于此。

同时,对于类库的开发者来说,他们可以在不影响外部使用的前提下,对类的逻辑和实现进行细节化的优化,从而提升类库的质量。

在使用 Symbol 对象实现私有成员时,我们需要注意 Symbol 值的唯一性这一特性。如果使用相同的 Symbol 值作为键名,会导致冲突和混乱。因此,我们应该为每个私有属性和方法都生成唯一的 Symbol 值。

总结

本文介绍了使用 ES6 的 Symbol 对象实现私有成员的封装方法。通过将私有成员的键名设置为 Symbol 类型,我们可以真正地把类的属性和方法封装起来,达到保护类不被误用或篡改的目的。同时,我们需要注意 Symbol 值的唯一性,保证每个私有属性和方法对应一个不同的 Symbol 值。

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

纠错
反馈

纠错反馈