• 【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中使用,使用它来定义类属性外部模块无法访问,达到了私有化的目的。

  • 相关阅读:
    【mac前端开发环境】
    【云原生-K8s-2】kubeadm搭建k8s高可用集群(三主两从一VIP)完整教程
    成人教育:毕业信息自我鉴定
    高频微观结构:日内及隔夜动量因子
    es6运算符扩展
    三维种子点生长算法(以及Python递归深度问题)
    LeetCode每日一题:754. 到达终点数字
    网络安全(黑客)自学
    面试官:group by 有哪些注意事项?
    开发模型>螺旋模型
  • 原文地址:https://blog.csdn.net/qq_41481731/article/details/125538416