1. 避免暴露内部数据逻辑
(function(_this) {
const COLOR = Symbol();
const RED = Symbol();
const GREEN = Symbol();
const BLUE = Symbol();
_this.COLOR_ENUM = {
[COLOR]: {
[RED]: '#FF0000',
[GREEN]: '#00FF00',
[BLUE]: '#0000FF'
},
getColor: function(color) {
switch(color) {
case this[COLOR][RED]: return '红色';
case this[COLOR][GREEN]: return '绿色';
case this[COLOR][BLUE]: return '蓝色';
default: return '无';
}
}
}
})(window);
COLOR_ENUM.getColor('#FF0000'); // "红色"
COLOR_ENUM[COLOR]; // Uncaught ReferenceError: COLOR is not defined
2. 屏蔽 Object.keys()
或者for...in
枚举对象的属性名,并且JSON.stringify()也会忽略Symbol属性。
let obj = {
[Symbol('name')]: 'Jack',
age: 18
}
Object.keys(obj) // ['age']
for (let p in obj) {
console.log(p) // 分别会输出:'age'
}
Object.getOwnPropertyNames(obj) // ['age']
// 使用Object的API
Object.getOwnPropertySymbols(obj) // [Symbol(name)]
// 使用新增的反射API
Reflect.ownKeys(obj) // [Symbol(name), 'age']
3. 注册可识别的 Symbol :
let s1 = Symbol.for('symbol_1') //注册一个全局Symbol
let s2 = Symbol.for('symbol_1') //获取全局Symbol
s1 === s2 // true