14. 如何使用 ES6 中的 Symbol 类型和 Reflect 去封装和操作对象的私有属性和方法?
约 494 字大约 2 分钟
2025-03-12
一、原理
我们可以利用以下特性来给对象添加一些非私有,但是不想对外公开的属性和方法
Symbol
作为键值时,属性无法被常规方法遍历和直接访问。Reflect
可以访问对象的原型,可以读取对象内Symbol
作为键值的数据。
虽然我们无法在外部操作对象内部 Symbo
l 作为键值的属性,但是同样我们可以在封装原型的时候,对外暴漏一个方法去操作这个值。
二、示例
1、封装
step 1 :使用
Symbol
类型创建一个唯一的键作为私有属性或方法的标识符。const _privateProperty = Symbol("privateProperty"); const _privateMethod = Symbol("privateMethod");
step 2:将私有属性和方法添加到对象上,并使用
Symbol
类型作为键。const obj = { [_privateProperty]: "private value", [_privateMethod]() { console.log("private method"); }, publicMethod() { console.log("public method"); this[_privateMethod](); }, };
结束
2、如何操作
2.1、可以使用Reflect
对象对私有属性进行读取和写入操作。
const privateValue = Reflect.get(obj, _privateProperty);
console.log(privateValue); // 输出: 'private value'
Reflect.set(obj, _privateProperty, "updated value");
const updatedValue = Reflect.get(obj, _privateProperty);
console.log(updatedValue); // 输出: 'updated value'
注意,使用Reflect.get
和Reflect.set
可以绕过常规的属性访问和赋值方式,从而访问和修改私有属性。
2.2、调用对象的公共方法来访问私有属性和方法。
obj.publicMethod(); // 输出: 'public method' 和 'private method'
公共方法可以访问和调用私有属性和方法,而外部代码无法直接访问或调用。
三、总结
通过使用Symbol
类型和Reflect
对象,可以有效地创建对象的私有属性和方法。这种方式可以保护对象的内部实现,防止外部代码直接访问和修改私有成员,提高代码的封装性和安全性。
更新日志
2025/8/24 08:17
查看所有更新日志
e7112
-1于