前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ES6语法中常量声明(const)的实现原理

ES6语法中常量声明(const)的实现原理

原创
作者头像
伯爵
修改2019-10-14 11:21:47
2.1K0
修改2019-10-14 11:21:47
举报
文章被收录于专栏:前端小菜鸟前端小菜鸟

ES6 const 特点:

  • 临时性死区
  • 在定义的时候完成初始化
  • 不能重新定义
  • 不能重新赋值
  • 语义化标识,表示声明后不可更改的不变量

原理:

  • ES5没有块级的概念,我们只能大概模拟一下const的定义。
  • 我们将const 声明的变量绑定在全局对象上,借助 Object.defineProperty()劫持该对象,配置相关描述符实现const的特性。
  • 关键字和数字不能作为对象属性
代码语言:txt
复制
var const_customer = function(param, value) {
    // 目前是在浏览器端测试全局对象window,如果是在node 环境全局对象global
    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(!param||_reg.test(parseFloat(param))||KEY_WORD.indexOf(param) > -1) {
        throw new Error(`Unexpected token: ${param}`);
    }

    //检测是否被定义
    if(_global.hasOwnProperty(param)) {
        throw new Error(`${param} has already been declared !`);
    }

    _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!`);
            } else {
                return value
            }
        }
    })
}

//功能测试

const_customer('TEST', "test_value"); 
console.log(TEST) // test_value
const_customer('TEST', "test_value"); // TEST has already been declared !
TEST = "TEST"; // Uncaught Error: TEST is read-only!
参考

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 参考
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档