ECMAScript 2021 (ES12) 中如何使用 Symbols 创建唯一的对象属性

阅读时长 5 分钟读完

Symbols 是 ECMAScript 2015 (ES6) 新增的基本数据类型之一,它可以创建一个唯一的、不可变的值,用于在对象中创建唯一的属性。在 ECMAScript 2021 (ES12) 中,Symbols 的使用也得到了进一步改进,本文将介绍如何使用 Symbols 创建唯一的对象属性。

什么是 Symbols?

Symbol 是 ECMAScript 中的一种新的原始数据类型,它可以用来创建一个唯一的、不可变的值。每一个使用 Symbol 创建的值都是唯一的,即使两个使用相同描述的 Symbol,它们也是不相等的。用来创建 Symbol 值的函数是 Symbol()

上面的代码中,s1s2 分别是两个不同的 Symbol 值,它们之间是不相等的。

创建唯一的对象属性

在 ECMAScript 中,对象的属性名可以是字符串或者数字。但是,属性名只能是唯一的,并且字符串属性名存在被意外覆盖的风险,比如在模块中引入同名的模块会影响全局变量。

为了解决这个问题,ES6 引入了 Symbols,可以用来创建唯一的属性名,避免了属性名冲突的问题。在 ES12 中,Symbol 的使用再次得到了升级,可以使用 Symbols 创建唯一的对象属性。

-- -------------------- ---- -------
----- ---- - ---------------
----- ------ - -
  ------- -----
  ---- ---
  ------- ----
--
-------------------------- -- ----
------------------------ -- --
--------------------------- -- ---

上面的代码中,name 是一个作为对象属性名的 Symbol 值,它的描述是 "name"。通过使用这个 Symbol 值可以为 person 对象创建唯一的属性名,避免了属性名冲突的问题。

需要注意的是,在使用 Symbols 为对象创建属性时,必须使用方括号语法,否则对象属性名将被解析成字符串。

Symbols 的应用场景

除了创建唯一的对象属性,Symbols 还有很多其他的应用场景。下面列举一些常见的使用场景。

1. 防止属性名冲突

Symbols 可以用来创建唯一的属性名,保证属性名不会冲突。

2. 封装类的方法和属性

Symbols 可以用来封装类的方法和属性,避免属性和方法名被意外覆盖。

-- -------------------- ---- -------
----- ----- - ---------------
----- ---- - --------------

----- ------ -
  ----------------- ---- -
    ----------- - -----
    ---------- - ----
  -

  --- ------ -
    ------ ------------
  -

  --- ---------- -
    -- ------- ----- --- -------- -- ----- - - -- ----- - ---- -
      ---------- - ------
    - ---- -
      ----- --- -------------- --- --------
    -
  -

  --- ----- -
    ------ -----------
  -
-

----- ------ - --- ------------ ----
------------------------- -- ----
------------------------ -- --
---------- - ---
------------------------ -- --
---------- - ---- -- ----

在上面的代码中,_name_age 都是作为 Person 类的私有属性,使用 Symbols 可以保证它们不会被意外覆盖。

3. 枚举对象的属性

Symbols 可以用来枚举对象的属性,避免了一些方法被意外调用。

-- -------------------- ---- -------
----- --- - -
  ----- -----
  ---- ---
  ------------------- ----
--

------------------------------ -- -------- ------
-------------------------------- -- ------ ---
--------------------------------- -- --------- ------ ------- ----
---------------------------------- -- -------- ------ ---------------

在上面的代码中,Object.keys()Object.values()Object.entries() 方法都无法获取到 Symbol 属性。Reflect.ownKeys() 方法可以获取到所有属性名,包括 Symbol 属性。

总结

本文介绍了如何使用 Symbols 创建唯一的对象属性,在 ES12 中 Symbols 的使用也得到了进一步改进。除了创建唯一的对象属性,Symbols 还有很多其他的应用场景,如防止属性名冲突、封装类的方法和属性、枚举对象的属性等。在实际开发中,应根据具体场景灵活使用 Symbols。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64cf0a5bb5eee0b5256862c0

纠错
反馈