在面向对象编程中,私有成员是类中不希望暴露出去的属性或方法。在传统的 JavaScript 中,通常通过约定“私有成员”的命名规则来实现。然而,这种实现方式容易被绕过,导致类的封装性受到破坏。ES6 引入了 Symbol 对象,可以更安全地实现私有成员的封装。
Symbol 对象
Symbol 对象是 ES6 中新增的一种基本数据类型,用于表示独一无二(唯一性)的值。每个 Symbol 值都是唯一的,由内部生成并暴露给外部使用。Symbol 值可以被用作对象属性的键名来保证不会出现重复。它的生成方式如下:
const sym = Symbol();
Symbol 对象还接受一个参数,用于描述 Symbol 值的含义。
const sym = Symbol('description');
用 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