ES6-const原理demo简单实现

const

ES6 中新增的命令,用于声明一个常量。一旦声明,常量的值就不能改变。且声明时必须初始化,不能留到以后赋值。const的作用域与let命令相同:只在声明所在的块级作用域内有效。

实现

实现之前我们必须分解一下const的功能都有哪些

  1. 变量一经声明便不可更改
  2. 变量是否是关键字
  3. 不能重复定义
  4. 变量名是否为数字

顺着这个思路,我们实现的代码如下:

// by:IU

//定义一个常量
function constCustomer(param,value){
    var _global = window;

    var KEY_WORD = ['const', 'let', 'var','class', 'return']; //关键字列表(不全)
    var REG_NUMBER =  '^[1-9][0-9]*([.][0-9]+)?$|0' ; //数字正则表达式
    var _reg = new RegExp(REG_NUMBER)

    // 检测是否已经定义,定义则抛出错误
     if(_global.hasOwnProperty(param)) {
        throw new Error(`${param} has already been declared !`);
    }

     //检测键值是否存在并且被支持
    if(!param||_reg.test(parseFloat(param))||KEY_WORD.indexOf(param) > -1) {
        throw new Error(`Unexpected token: ${param}`);
    }

    _global[param] = value

    // 劫持该常量&&不可修改
    Object.defineProperty(_global,param,{
        enumerable:false,
        configurable: false, 
        get:function(){
            return value
        },
        set:function(data){
            if(_global.hasOwnProperty(param)){
               throw new Error(`${param} is read-only!`);
            }
            return data
        }
    })
}

// 定义测试
constCustomer('winName','tieniu')
console.log('winName',winName)

// 重复声明测试
// constCustomer('winName','JionChao')
// console.log('winName2',winName)

// 字母&&数字变量名测试
// constCustomer('xxx123',1)

// 纯数字测试
constCustomer('123',1)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值