Symbol 的一个常见用途是创建对象的私有属性或方法,这些属性或方法不能被外部访问或修改
const animal = {
[Symbol('name')]: 'Leo',
[Symbol('age')]: 3,
[Symbol('getType')]() {
return 'Mammal';
}
};
console.log(animal[Symbol('name')]); // undefined
console.log(animal[Symbol('age')]); // undefined
console.log(animal[Symbol('getType')]()); // undefined
console.log(Object.getOwnPropertySymbols(animal)); // [ Symbol(name), Symbol(age), Symbol(getType) ]
Symbol创建的属性不能被外部访问的主要原因是它们不会出现在对象的常规属性列表中- 意味着无法通过常规的属性访问方法(例如点号或方括号)来获取或修改
Symbol属性的值。
具体来说,以下是 Symbol 属性不能被外部访问的原因:
- 唯一性:每个通过
Symbol()创建的值都是唯一的,即使两个符号具有相同的描述,它们仍然是不同的。因此,除非你拥有对符号的引用,否则无法在外部代码中访问或修改这些符号。 - 隐藏性:
Symbol属性不会出现在对象的常规属性列表中 - 例如
Object.keys()、for...in循环和Object.getOwnPropertyNames()方法不会返回Symbol属性。 - 这使得它们对外部代码是隐藏的,从而保护了它们不被意外访问。
Object. getOwnPropertySymbols
尽管 Symbol 属性不能被直接外部访问,但可以使用 Object.getOwnPropertySymbols() 或 Reflect.ownKeys() 方法来获取对象的所有 Symbol 属性,并进行相应的操作
animal[Object.getOwnPropertySymbols(animal)[0]]//leo
Symbol.iterator
Symbol.iterator是 ECMAScript 6 中引入的一种特殊的符号(Symbol)- 它用于定义对象的默认迭代器方法。
- 所有实现了
Symbol.iterator方法的对象都被认为是可迭代的(iterable). - 可以通过
for...of循环或其他迭代器相关的方法进行遍历。
const myiterator = {
data: ['apple', 'bannana', 'orange'],
[Symbol.iterator]() {
let index = 0
return {
next: () => {
if (index < this.data.length) {
return { value: this.data[index++], done: false }
}
else{
return {value:'',done:true}
}
}
}
}
}
for (const iterator of myiterator) {
console.log(iterator)
}
[Symbol.iterator](){ reutrn { next :()=>{}}}return {value:,done:}
Symbol的其他用途
- 缓存键:在缓存系统中,可以使用
Symbol作为对象的键,以确保键的唯一性,并避免与其他属性发生冲突。
const cache = {
[Symbol('userCache')]: {},
[Symbol('productCache')]: {},
// 其他缓存...
};
-
- 事件系统:在项目中可以使用
Symbol创建自定义事件类型,用于实现自定义事件的订阅和发布。
- 事件系统:在项目中可以使用