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顶层对象实现 |