美文网首页
ES6实现枚举类

ES6实现枚举类

作者: W北落师门W | 来源:发表于2018-09-03 22:11 被阅读0次

    因为实际业务中有需求,利用ES6实现了一个枚举类,可以实现A.B.name的使用需求

    class EsEnum {
        constructor(arr) {
            let typeArr = [];
    
            if (!Array.isArray(arr)){
                throw 'arr is not an array!';
                return;
            }
    
            arr.map(element => {
                if(!element.code || !element.name) {
                    return;
                }
                // 保存code值组成的数组,方便A.getName(name)类型的调用
                typeArr.push(element.code);
                // 根据code生成不同属性值,以便A.B.name类型的调用
                this[element.code] = element;
            });
            
            // 保存源数组
            this.arr = arr; 
            this.typeArr = typeArr;
        }
    
        // 根据code得到对象
        valueOf(code) {
            return this.arr[this.typeArr.indexOf(code)];
        }
    
        // 根据code获取name值
        getNameByCode(code){
            let prop = this.valueOf(code);
            if (!prop){
                throw 'No enum constant'  + code;
                return;
            }
    
            return prop.name;
        }
    
        // 返回源数组
        getValues() {
            return this.arr;
        }
    }
    
    export default EsEnum;
    

    使用方式

    const ResourceStatusEnum = new EsEnum([
        {code: 'WAIT_APPROVE', name: "未审核"},
        {code: 'ENABLED', name: '启用'},
        {code: 'REFUSED', name: '审核未通过'},
        {code: 'DISABLED', name: '停用'}
    ]);
    
    console.log(ResourceStatusEnum.ENABLED.name);  // 启用
    console.log(ResourceStatusEnum.getNameByCode('ENABLED'));  //启用
    console.log(ResourceStatusEnum.getValues());
    /*
    [ { code: 'WAIT_APPROVE', name: '未审核' },
      { code: 'ENABLED', name: '启用' },
      { code: 'REFUSED', name: '审核未通过' },
      { code: 'DISABLED', name: '停用' } ]
    */
    

    博客地址 北落师门

    相关文章

      网友评论

          本文标题:ES6实现枚举类

          本文链接:https://www.haomeiwen.com/subject/umxwwftx.html