Reflect、Proxy、Symbol
Symbol
介绍
引入:从根本上防止对象名属性名的冲突的机制。
Symbol是javascript的第七种语言
1  | typeof Symbol("foo")  | 
参数为字符串
1  | let s1 = Symbol('foo');  | 
参数是对象
1  | // 调用对象的toString()  | 
注意
1  | // 没有参数的情况  | 
可以转化为Boolean值
1  | let sym = Symbol();  | 
作为属性名
每一个 Symbol 值都是不相等的,保证不同名
1  | let mySymbol = Symbol();  | 
1  | // 为对象属性名时,不能用点运算符  | 
定义一组常量
1  | const log = {};  | 
遍历
属性名的遍历
Symbol 作为属性名,该属性不会出现在for...in、for...of循环中,也不会被Object.keys()、Object.getOwnPropertyNames()、JSON.stringify()返回。
Object.getOwnPropertySymbols
1  | // 返回值为数组  | 
Reflect.ownKeys
1  | let obj = {  | 
Symbol.for()
1  | let s1 = Symbol.for('foo');  | 
和Symbol()的区别
都会生成新的 Symbol。
区别:前者有全局登记特性
1  | // Symbol.keyFor()方法返回一个已登记的 Symbol 类型值的key  | 
即使for()不在全局环境
1  | function foo() {  | 
实例
消除魔术字符串
1  | function getArea(shape, options) {  | 
模块的 Singleton 模式
Singleton 模式指的是调用一个类,任何时候返回的都是同一个实例。
1  | // global顶层对象实现  |