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)

你可能感兴趣的:(【ES6系列】,es6,javascript,前端)