随着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