在 ES6、ES7 和 ES8 中使用 Symbols 知道的关键必要事项

随着JavaScript语言不断改进和发展,我们现在已经有了许多新的特性和函数,这些特性和函数大大改进了我们的工作流程。其中一个新特性就是Symbols,Symbols是ES6中最受欢迎,也是最容易被忽视的特性之一。这篇文章的目的是教你在ES6、ES7和ES8中使用Symbols以及它们的内部工作原理。

什么是Symbols?

ES6中的Symbols是JavaScript中的一种基本类型(像数字和字符串一样)。Symbols是仅有的和不可变的,所以它们是唯一的,也就是说,不同于字符串、整数和浮点数等其他JavaScript基本类型,两个Symbols永远不会相等。Symbols的应用是创建数字、字符串和函数等常量,Symbol常量将被保留在全局符号注册表中,并在应用程序的整个生命周期内保持不变。

如何使用Symbols

创建Symbols

有两种方法来创建一个Symbol:用global Symbol注册表或者字面量创建:

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

创建字符串标识符可以方便地将Symbol与其他对象关联起来,另外值得一提的是,每个Symbol都有一个字符串描述符,通常使用来验证Symbols是否相等。

Symbols在对象中的应用

Symbol经常用于为某个对象添加额外的数据和功能。例如,在代码中可以创建一个Symbol作为对象的私有成员,这部分成员将被隐藏并保护防止被误用。

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

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

上述代码在对象person中添加了一个Symbol作为私有成员,该成员不会在Object.keys中被返回。

对象Symbol的有趣之处在于我们可以将其作为“只读”属性来使用。例如,我们可以为一个函数中的某个参数对象创建多个Symbol,每个Symbol都表示一个不同的处理阶段,并将其作为参数直接传递。

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

在上面的代码片段中,我们使用两个不同的Symbol作为参数传递,执行onClick函数的和绑定到事件监听器的两个不同阶段,这个实现方式很优雅并且易于理解。

Symbol在浏览器API中的应用

举一个实际的应用场景,我们来看看WebSocket API,它可以让我们在浏览器中实现基于事件的通信。由于WebSocket很容易被攻击,因此我们希望通过使用Symbols将其标记为私有属性的方式来防范攻击。

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

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

上面的代码示例中,WebSocket实例执行时设置了handlers常量的Symbol成员,handlers的各个Symbol作为私有属性,以防止攻击者通过公共接口访问它们。同时,我们使用 on 方法将回调函数传递给存储在 WebSocket 实例中的handlers对象。

建议

使用Symbols时需要注意上面的细节:Symbols是唯一存在的,我们无法通过字符串获取Symbols,因此可以保护其在应用程序的生命周期中的意义。当使用Handlers(Symbol)时,也建议创建 public 方法来使对象的使用方轻松访问并减少错误。

结论

Symbols是JavaScript中一种强大的基本类型,提供了一种创建和保护常量和对象私有成员的新方法。本文介绍了Symbols的工作原理和如何在ES6、ES7和ES8中使用它。希望这篇文章对你有所帮助。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6736c4010bc820c582564453