在 ES6 中,Symbol 是一种新的基本数据类型,它的主要作用是用于创建唯一的标识符,避免命名冲突。除了作为标识符,Symbol 还有一些其他的应用,比如用于定义对象的私有属性和方法。
创建 Symbol
创建 Symbol 的方式很简单,只需要调用全局的 Symbol 函数即可:
const s1 = Symbol(); const s2 = Symbol('foo');
其中,第二个参数是可选的,用于给 Symbol 命名,方便调试和区分。
Symbol 属性名
除了作为变量之外,Symbol 还可以作为对象的属性名。与字符串属性名不同,Symbol 属性名是独一无二的,不会被其他属性名覆盖或重复。
const name = Symbol('name'); const person = { [name]: '张三' }; console.log(person[name]); // '张三'
Symbol 原型对象
除了基本用法之外,Symbol 还有一些特殊的应用,比如 Symbol.hasInstance 和 Symbol.iterator 等。这些应用都是通过在原型对象上定义 Symbol 属性来实现的。
以 Symbol.hasInstance 为例,它是用于判断一个对象是否为某个构造函数的实例,可以通过重写构造函数的原型对象上的 Symbol.hasInstance 属性实现:
class Person {} const obj = new Person(); console.log(obj instanceof Person); // true Person.prototype[Symbol.hasInstance] = function(instance) { return instance instanceof Person; } console.log(obj instanceof Person); // true
Symbol 的应用
除了作为标识符和定义原型对象上的属性之外,Symbol 还有一些其他的应用。比如,可以用 Symbol 定义对象的私有属性和方法:
-- -------------------- ---- ------- ----- ---------------- - -------------------------- ----- ------- - ------------- - ---------------------- - -- - ------------------ - ------------------------------------ - -------------- - ----------------------- - - ----- --- - --- ---------- ------------------- -- -- - ---------------------- -- ----------------- ---- ----------------------------------- -- -------------------------- ----展开代码
Symbol 还可以用于定义对象的迭代器,可以通过在对象的 Symbol.iterator 属性上定义一个迭代器函数来实现:
-- -------------------- ---- ------- ----- --- - --- -- --- ----- --- - - ------------------- - --- ----- - -- ------ - ----- -- -- - -- ------ - ----------- - ----- ----- - ------------- ------ - ------ ----- ----- -- - ---- - ------ - ----- ---- -- - - - - -- --- ------ ---- -- ---- - ------------------ -展开代码
总结
Symbol 是一种特殊的数据类型,用于创建唯一的标识符。除了作为标识符之外,Symbol 还可以用于定义对象的私有属性和方法,以及定义对象的迭代器等。熟练掌握 Symbol 的使用,能够帮助我们更好地设计和实现复杂的前端应用程序。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6497debc48841e98944e6827