如何在 ES5 环境下实现一个const ?

博客围绕JavaScript展开,介绍了Object对象属性描述符,包括数据描述符和存取描述符,说明了它们可修改的属性,如configurable、enumerable等。还提到ES5环境下const的实现原理,以及Vue双向绑定利用Object.defineProperty实现的思路。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

  • 刚刚看了掘金上一篇文章《作为技术面试官,为什么把你pass了》,里面第一题就是用es5实现const,据作者反馈 这一题所有的面试者都没有回答出来,感觉挺可惜的,其实这是一道比较简单的题目,但是由于涉及到了一些Object对象属性描述符的知识,这些描述符往往用到的场景不多,所以不容易记住。

属性描述符:

对象里目前的属性描述符有两种:

  • 数据描述符:具有值的属性
  • 存取描述符:由getter与setter函数对描述的属性

描述符功能:

数据描述符与存取描述符皆可修改:
  • configurable:当前对象元素的属性描述符是否可改,是否可删除
  • enumerable:当前对象元素是否可枚举
唯有数据描述符可以修改:
  • value: 当前对象元素的值
  • writable:当前对象元素的值是否可修改
唯有存取描述符可以修改:
  • get:读取元素属性值时的操作
  • set:修改元素属性值时的操作

描述符可同时具有的键值:

configurableenumerablevaluewritablegetset
数据描述符YesYesYesYesNoNo
存取描述符YesYesNoNoYesYes

const 实现原理

由于ES5环境没有block的概念,所以是无法百分百实现const,只能是挂载到某个对象下,要么是全局的window,要么就是自定义一个object来当容器

      var __const = function __const (data, value) {
        window.data = value // 把要定义的data挂载到window下,并赋值value
        Object.defineProperty(window, data, { // 利用Object.defineProperty的能力劫持当前对象,并修改其属性描述符
          enumerable: false,
          configurable: false,
          get: function () {
            return value
          },
          set: function (data) {
            if (data !== value) { // 当要对当前属性进行赋值时,则抛出错误!
              throw new TypeError('Assignment to constant variable.')
            } else {
              return value
            }
          }
        })
      }
      __const('a', 10)
      console.log(a)
      delete a
      console.log(a)
      for (let item in window) { // 因为const定义的属性在global下也是不存在的,所以用到了enumerable: false来模拟这一功能
        if (item === 'a') { // 因为不可枚举,所以不执行
          console.log(window[item])
        }
      }
      a = 20 // 报错
复制代码

题外话

Vue目前双向绑定的核心实现思路就是利用Object.defineProperty对getset进行劫持,监听用户对属性进行调用以及赋值时的具体情况,从而实现的双向绑定~~



如果你、喜欢探讨技术,或者对本文有任何的意见或建议,你可以扫描下方二维码,关注微信公众号“ 鱼头的Web海洋”,随时与鱼头互动。欢迎!衷心希望可以遇见你。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值