使用符号值

你可以在任意能使用 “需计算属性名” 的场合使用符号。此前的例子已经展示了符号的方括号用法,而你还能在对象的 “需计算字面量属性名” 中使用符号,此外还可以在 Object.defineProperty()Object.defineProperties() 调用中使用它,例如:

let firstName = Symbol("first name");

// use a computed object literal property
let person = {
    [firstName]: "Nicholas"
};

// make the property read only
Object.defineProperty(person, firstName, { writable: false });

let lastName = Symbol("last name");

Object.defineProperties(person, {
    [lastName]: {
        value: "Zakas",
        writable: false
    }
});

console.log(person[firstName]);     // "Nicholas"
console.log(person[lastName]);      // "Zakas"

这个例子首先使用对象的 “需计算字面量属性” 方式创建了一个符号类型的属性 firstName,该属性使用 getOwnPropertyDescriptor 查看时显示为可枚举(enumerable: true),但无法用 for-in 循环遍历,也不会显示在 Object.keys() 的结果中。下一行代码将该属性设置为只读。接下来,使用 Object.defineProperties() 方法创建了一个只读的符号类型属性 lastName,而此时再次使用了 “需计算字面量属性” 方式,并将其作为第二个调用参数的一部分。

既然能在任意可使用 “需计算属性名” 的场合使用符号,你就需要一种在不同代码段中共享符号值的方式,以便更有效地使用它们。