利用 Symbol 实现真正的对象私有属性与元编程
深入理解 Symbol 的不可枚举特性,用于创建隐藏属性、自定义迭代器及元编程模式。 · 难度:入门 · +10XP
利用 Symbol 实现真正的对象私有属性与元编程
传统的 JavaScript 对象属性默认可枚举,容易被 for...in 或 Object.keys 暴露。Symbol 提供了唯一且不可枚举的键,可用于隐藏内部状态,例如缓存、私有计数器或元数据。结合全局 Symbol 注册表(Symbol.for),还可以在多个模块间共享符号而避免冲突。此外,通过知名符号(如 Symbol.iterator、Symbol.toPrimitive)可以定制对象的迭代行为和类型转换,实现深度元编程。本教程将演示如何用 Symbol 构建安全的私有属性,并重新定义对象的底层行为。
const _data = Symbol('data');
class Widget {
constructor(value) {
this[_data] = value;
}
getData() { return this[_data]; }
Symbol.toPrimitive {
return hint === 'string' ? this[_data].toString() : 42;
}
}
const w = new Widget(100);
console.log(Object.keys(w)); // []
console.log(String(w)); // '100'