深入理解ES6之—符号与符号属性
程序员文章站
2022-03-10 19:24:39
在js已有的基本类型(字符串,数值,布尔型,null和undefined)之外,es6引入了一种新的基本类型:==符号(Symbol)==。符号起初被设计用于创建对象私有成员。 符号没有字面量形式,你可以使用全局Symbol函数来创建一个符号值。 Symbol还可以接受一个额外的参数用于描述符号值。 ......
在js已有的基本类型(字符串,数值,布尔型,null和undefined)之外,es6引入了一种新的基本类型:==符号(Symbol)==。符号起初被设计用于创建对象私有成员。
符号没有字面量形式,你可以使用全局Symbol函数来创建一个符号值。
let firstName = Symbol(); let person = {}; person[firstName] = "nicolas"; console.log(person[firstName]);
Symbol还可以接受一个额外的参数用于描述符号值。建议始终给符号提供描述信息,以便更好的阅读代码和进行调试。
使用符号值let firstName = Symbol("first name"); let person = { [firstName]: "nicolas" } //让改属性变成只读的 Object.defineProperties(person, firstName, { writable: false }); let lastName = Symbol("last name"); Object.defineProperties(person, { [lastName]: { value: "cc", writable: false } }); person[lastName] = "dd"; console.log(person[firstName]);//nicolas console.log(person[lastName]);//cc共享符号值
如果要创建共享符号值,应使用Symbol.for()方法而不是Symbol()方法。Symbol.for()接受单个字符串类型的参数,作为目标符号值的标识符,同时此参数也会成为该符号的描述信息。
let uid = Symbol.for("uid"); let object = {}; object[uid] = "12345"; console.log(object[uid]);//12345 console.log(uid);//Symbol(uid)
Symbol.for()方法首先会搜索全局符号注册表,看是否存在一个键值为“uid”的符号值。
检索符号属性Object.keys()和Object.getPropertyNames()方法可以检索对象的所有属性和名称,前者返回所有的可枚举属性名称,后者返回所有属性名称而无视其是否可枚举。es6新增了Object.getOwnPropertySymbols()方法,以便可以检索对象的符号类型属性。
let uid = Symbol.for("uid"); let first = Symbol("first name"); let object = { name: "cc", age: 26 }; object[uid] = "12345"; object[first] = "111"; console.log(Object.getOwnPropertyNames(object));//["name","age"] console.log(Object.getOwnPropertySymbols(object));//[Symbol(uid),Symbol(first name)]