Appearance
应用:用作属性名
本节目标:理解“应用:用作属性名”的核心思路,并能把它用于实际开发或面试表达。 由于每一个Symbol值互不相等,所以Symbol值用作对象的属性名,就能保证不会出现同名的属性。这对于一个对象由多个模块构成的情况非常有用,能防止某一个属性名(健)不小心被改写或覆盖。
注意:是Symbol值作为属性名时,该属性还是公开属性,不是私有属性。
**定义****Symbol****属性的三种方法**
let mySymbol = Symbol();
// 第一种写法:方括号[]let a = {};a[mySymbol] = 'Hello!';
// 第二种写法:对象字面量let a = { [mySymbol]: 'Hello!'};
// 第三种写法let a = {};Object.defineProperty(a, mySymbol, { value: 'Hello!' });
// 以上写法都得到同样结果a[mySymbol] // "Hello!"注意:Symbol 值作为对象属性名时,必须放在方括号中。不能用点运算符,因为点运算符后面总是字符串。
const mySymbol = Symbol();const a = {};
a.mySymbol = 'Hello!';a[mySymbol] // undefineda['mySymbol'] // "Hello!"
在对象的内部也如此
let s = Symbol();
let obj = { [s]: function (arg) { ... }};
obj[s](123);**属性值为方法时**
采用增强的对象写法,上面代码的obj对象可以写得更简洁一些。
let obj = { [s](arg) { ... }};