• 【ECMAScript6】Symbol及其相关使用


    1、创建Symbol类型

     		let s = Symbol()
            console.log(s, typeof s)
            let s1 = Symbol('Leozi')
            console.log(s1, typeof s1)  // Symbol('Leozi') symbol
            let s2 = Symbol('Leozi')
            console.log(s1 === s2)   // false
    
            let s3 = Symbol.for('Leozi')
            let s4 = Symbol.for('Leozi')
            console.log(s3 === s4)    // true
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    注意:Symbol类型不能和其它数据进行运算或比较,Symbol类型的Key不能通过Object.keys()、for…in、getOwnPropertyNames枚举,它没有被包含在对象自身的属性名集合中,故可以把不对外开放的属性用Symbol定义。

    2、JS中所有数据类型:Number\String\Object\null\undefined\Boolean\Symbol

    3、Symbol使用场景

    3.1 给对象添加属性

    由于Symbol类型的唯一性,可以用它来对不知道内部结构的对象添加属性,这样可以保证对象内的属性名不重复。

            let game = {
                name : 'Leozi',
                id : 123,
                vip : true,
                up : function () { console.log(1) },
                down : function () { console.log(2) },
                [Symbol('say')] : function () {
                    console.log(33)
                }
            }
    
            let method = {
                up: Symbol(),
                down: Symbol()
            }
    
            game[method.up] = function () {
                console.log(11)
            }
            game[method.down] = function () {
                console.lof(22)
            }
    
            console.log(game)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    3.2 私有属性
    a.js
    
    		const PASSWORD = Symbol()
    		 
    		class Login {
    		    constructor(username,password){
    		        this.username = username;
    		        this[PASSWORD] = password
    		    }
    		 
    		    checkPassword(pwd){
    		        return this[PASSWORD] === pwd
    		    }
    		}
    		 
    		export default Login;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    index.js
    
            import Login from "/a.js";
     
            const login = new Login("admin", "123456");
            
            console.log(login.checkPassword("123456")) // true
            
            console.log(login.PASSWORD) // undefined
            console.log(login["PASSWORD"]) // undefined
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    由于Symbol常量PASSWORD被定义在a.js模块中,外面模块无法获取此Symbol(Symbol是唯一的),因此PASSWORD只能被限定在a.js中使用,使用它来定义类属性外部模块无法访问,达到了私有化的目的。

  • 相关阅读:
    《宝塔面板教程1》:宝塔面板安装命令及安装要求
    支付宝支付&内网穿透
    AVL树简介
    漏刻有时数据可视化Echarts组件开发(27):盒须图(箱线图)前后端php交互的实战案例
    数据库最基础命令的大集合,四类分别有DDL、DCL、DQL、DML,让我给你解释一下吧
    Centos7上面安装uWSGI 部署项目测试
    十一月组队学习报名啦!
    利用结构体完成图书新增交互
    2.6.5
    python基于PHP+MySQL的连锁酒店管理系统
  • 原文地址:https://blog.csdn.net/qq_41481731/article/details/125538416