第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請及時(shí)綁定郵箱和手機(jī)立即綁定

如何在 ES5 環(huán)境下實(shí)現(xiàn)一個(gè)const ?

標(biāo)簽:
Html/CSS

前言

  • 刚刚看了掘金上一篇文章《作为技术面试官,为什么把你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进行劫持,监听用户对属性进行调用以及赋值时的具体情况,从而实现的双向绑定~~



點(diǎn)擊查看更多內(nèi)容
1人點(diǎn)贊

若覺得本文不錯(cuò),就分享一下吧!

評(píng)論

作者其他優(yōu)質(zhì)文章

正在加載中
感謝您的支持,我會(huì)繼續(xù)努力的~
掃碼打賞,你說多少就多少
贊賞金額會(huì)直接到老師賬戶
支付方式
打開微信掃一掃,即可進(jìn)行掃碼打賞哦
今天注冊有機(jī)會(huì)得

100積分直接送

付費(fèi)專欄免費(fèi)學(xué)

大額優(yōu)惠券免費(fèi)領(lǐng)

立即參與 放棄機(jī)會(huì)
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)

舉報(bào)

0/150
提交
取消