国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

如何在 ES5 環境下實現一個const ?

Muninn / 900人閱讀

作者:陳大魚頭

github: KRISACHAN

前言

剛剛看了掘金上一篇文章《作為技術面試官,為什么把你pass了》,里面第一題就是用es5實現const,據作者反饋 這一題所有的面試者都沒有回答出來,感覺挺可惜的,其實這是一道比較簡單的題目,但是由于涉及到了一些Object對象屬性描述符的知識,這些描述符往往用到的場景不多,所以不容易記住。

屬性描述符: 對象里目前的屬性描述符有兩種:

數據描述符:具有值的屬性

存取描述符:由getter與setter函數對描述的屬性

描述符功能:

數據描述符與存取描述符皆可修改:

configurable:當前對象元素的屬性描述符是否可改,是否可刪除

enumerable:當前對象元素是否可枚舉

唯有數據描述符可以修改:

value: 當前對象元素的值

writable:當前對象元素的值是否可修改

唯有存取描述符可以修改:

get:讀取元素屬性值時的操作

set:修改元素屬性值時的操作

描述符可同時具有的鍵值:
configurable enumerable value writable get set
數據描述符 Yes Yes Yes Yes No No
存取描述符 Yes Yes No No Yes Yes
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海洋”,隨時與魚頭互動。歡迎!衷心希望可以遇見你。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/6907.html

相關文章

  • ES5和ES6作用域詳解

    摘要:允許在塊級作用域內聲明函數。上面代碼中,存在全局變量,但是塊級作用域內又聲明了一個局部變量,導致后者綁定這個塊級作用域,所以在聲明變量前,對賦值會報錯。 ES5的作用域 變量起作用的范圍,js中能創建作用域的只能是函數 { let a = 1; var b = 2; } console.log(a); // a is not defined console.log(b); //...

    Dr_Noooo 評論0 收藏0
  • 面試官:自己搭建過vue開發環境嗎?

    摘要:在搭建過程中,還是會踩很多坑的。如果還不熟悉的話,建議自己搭建一次。開篇 原文地址:www.ccode.live/lentoo/list… 前段時間,看到群里一些小伙伴面試的時候被面試官問到這類題目。平時大家開發vue項目的時候,相信大部分人都是使用 vue-cli腳手架生成的項目架構,然后 npm run install 安裝依賴,npm run serve啟動項目然后就開始寫業務代碼...

    HelKyle 評論0 收藏0
  • ES6核心特性

    摘要:報錯不報此外還有個好處就是簡化回調函數正常函數寫法箭頭函數寫法改變指向長期以來,語言的對象一直是一個令人頭痛的問題,在對象方法中使用,必須非常小心。 前言 ES6 雖提供了許多新特性,但我們實際工作中用到頻率較高并不多,根據二八法則,我們應該用百分之八十的精力和時間,好好專研這百分之二十核心特性,將會收到事半功倍的奇效!寫文章不容易,請大家多多支持與關注!本文首發地址GitHub博客(...

    loostudy 評論0 收藏0
  • ES6核心特性

    摘要:報錯不報此外還有個好處就是簡化回調函數正常函數寫法箭頭函數寫法改變指向長期以來,語言的對象一直是一個令人頭痛的問題,在對象方法中使用,必須非常小心。 前言 ES6 雖提供了許多新特性,但我們實際工作中用到頻率較高并不多,根據二八法則,我們應該用百分之八十的精力和時間,好好專研這百分之二十核心特性,將會收到事半功倍的奇效!寫文章不容易,請大家多多支持與關注!本文首發地址GitHub博客(...

    _DangJin 評論0 收藏0
  • ES6學習 第一章 let 和 const 命令

    摘要:外層作用域不報錯正常輸出塊級作用域與函數聲明規定,函數只能在頂層作用域和函數作用域之中聲明,不能在塊級作用域聲明。規定,塊級作用域之中,函數聲明語句的行為類似于,在塊級作用域之外不可引用。同時,函數聲明還會提升到所在的塊級作用域的頭部。 前言:最近開始看阮一峰老師的《ECMAScript 6 入門》(以下簡稱原...

    番茄西紅柿 評論0 收藏2637

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<