Symbol
是 ECMAScript6 中引入的一种新的原始数据类型,表示独一无二的值。它可以用来定义私有属性等特殊的用途。在 ECMAScript9(ES2018)中,Symbol
的原型对象 Symbol.prototype
也进行了增强,本文将着重介绍 Symbol.prototype
对象的新特性及其应用。
Symbol.prototype.description
Symbol
可以通过 Symbol()
函数创建,它的参数是一个可选的描述字符串,该描述字符串仅在调试时有用。在 ES9 中,Symbol.prototype
新增了一个只读属性 description
,用于获取此描述字符串,例如:
const sym = Symbol('hello'); console.log(sym.description); // "hello"
这个新增的特性与 TypeScript 3.1 引入的标记模板字符串相匹配,这意味着在实现中添加这样的特性时,这种类型化行为是有用的。
Symbol.prototype[Symbol.toPrimitive]
新的 Symbol.toPrimitive
属性是一个内部属性,在类似于 Number()
、String()
、Object()
等构造函数中被调用,它决定了将 Symbol
转换为其它类型的规则。Symbol
有三种转换模式:"number"、"string" 和 "default"。使用 Symbol.toPrimitive
可以定义在某个场景下需要返回哪种类型的值,例如:
-- -------------------- ---- ------- ----- --- - ---------------- ----------------------- - -------------- - -- ----- --- --------- - ------ ---- - ---- - ------ -------- - -- --------------- - ---- -- ------- --------------- - --- -- ---
Symbol.prototype.toStringTag
在调试控制台中输出对象时,它会附带一个 toString()
方法输出的标签。使用 Symbol.prototype.toStringTag
属性可以自定义这个标签。例如:
const myObj = { [Symbol.toStringTag]: 'MyObject' }; console.log(myObj.toString()); // "[object MyObject]"
总结
ES9 中对 Symbol.prototype
对象进行了增强,添加了一些新方法和属性,使得 Symbol
的使用更加方便和灵活。以上三个新特性也可以组合使用,例如,设置 description
和 toStringTag
属性,可以很方便地创建出可读性更好的 Symbol
。使用 Symbol.toPrimitive
属性,甚至可以自定义 Symbol
的各种类型转换模式,为 Symbol
的使用提供更多的可能。
值得注意的是,由于 Symbol
是一个新的原始数据类型,许多老旧的 JavaScript 库和框架可能不支持它,需要在使用之前进行检查。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64febb2e95b1f8cacdd68f8b