用ES5的方式实现const

ES5中的两种属性类型:数据属性和访问器属性;

数据属性:包含一个数据值的位置,在这个位置可以读取和写入值;有4个描述其行为的特性;

Configuarable: 能否通过delete删除属性,并且重新定义属性,

Enumerable: 能否通过for-in循环返回该属性,

Writable: 能否修改属性的值;

Value: 这个属性的数据值,默认为undefined

根据定义对象的方式不同,Configurable,Enumerable,Writable默认值也不同

方式1: var person = {name: '张三'}

则person对象的name属性的属性描述符对象中的Configurable,Enumerable,Writable 值均默认为true

方式2:

var person = {}

Object.defineProperty(person,'name',{

value: '张三'

})

则person对象的name属性的属性描述符对象中的Configurable,Enumerable,Writable 值均默认为false

    // "use strict"
    var person = {}
    Object.defineProperty(person, 'name', {
      value: '张三'
    })
    console.log(person.name); //张三
    //启用严格模式时: "use strict"; Uncaught TypeError: Cannot assign to read only property 'name' of object '#<Object>'
    person.name = '李四'; 
    console.log(person.name);   //张三

访问器属性:不包含数据值,包含一对儿的getter和setter函数

Configuarable: 能否通过delete删除属性,并且重新定义属性,

Enumerable: 能否通过for-in循环返回该属性,

Get: 在读取属性时调用的函数,默认为undefined

Set: 在写入属性时调用的函数,默认为undefined

访问器属性不能直接定义,必须使用Object.defineProperty()来定义

 

// 1. 自定义容器充当数据的存储
    var constObj = {}
    function getConst(key, val) {
      constObj[key] = val;
      Object.defineProperty(constObj, key, {
        value: val,
        configurable: false, //配置信息是否可修改
        writable: false, //是否可修改改属性值
        enumerable: true //是否可枚举
      })
    }
    getConst('a', 10)
    constObj.a = 20;
    console.log(constObj.a);    //10

   // 2. 挂载到window上面
    function getConst2(constKey, constVal) {
      window[constKey] = constVal;
      Object.defineProperty(window, constKey,{
        get: function() {   //如果设置了 set 或 get, 就不能设置 writable 和 value 中的任何一个,否则报错
          return constVal;
        },
        enumerable: true, //是否可枚举
        configurable: false,  //是否可修改当前描述的配置信息
      })
    }
    getConst2('b', 30);
    getConst2('c', 50);
    console.log(window.b);    //30
    console.log(window.c);    //50
    window.b = 66
    console.log(window.b);    //30

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wen_文文

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值