es5實現let和const


es5實現let和const

一、let

let的特性

首先我們來看看let的特性,let用來聲明一個變量:

  • 在塊級作用域內有效

  • 不能重復聲明

  • 不能預處理,不存在變量提升,即未聲明之前的代碼不能調用

如何實現

我們可以通過匿名函數和閉包的形式來模擬let

(function(){
  var c =3
  console.log(c) //1
})()
console.log(c)  //c is not defined
​

 

如上面的代碼,用匿名函數的作用域來模擬塊級作用域,將用到let的代碼放到匿名函數中,就不會造成變量污染了

二、const

const的特性

const用於聲明一個常量,

在塊級作用域內有效
不能重復聲明
不能預處理,不存在變量提升,即未聲明之前的代碼不能調用
  • 他除了有和let一樣的特性外,還有自己的特性:不能修改(要注意,數組和對象屬於引用數據類型,const保存的是指向對象的指針,所以修改其中的屬性時指針不變,可以修改)

  • 使用時必須初始化(必須賦值)

//即不能是
const c
//必須
const c =1
​

如何實現const

這個是今天的重頭戲,要實現const我們必須了解js中的數據屬性和訪問器屬性,了解了之后說不定你自己已經有思路實現const了

數據屬性

定義在對象內部的數據有四個特征:

  • configurable:是否可以被 delete 刪除或者改變特征值

  • enumerable:是否能通過 for-in 循環遍歷返回屬性

  • writable:是否可以修改屬性的值

  • value:保存這個屬性的數據值

訪問器屬性

指以下四個屬性:

  • configurable:能否通過 delete 刪除,能否修改屬性特性

  • enumerable:能否通過 for-in 循環返回屬性

  • getter:讀取屬性時調用的函數,默認為 undefined

  • setter:寫入屬性時調用的函數,默認為 undefined

用對象直接創建的屬性,其writable、enumerable和configurable 都是默認為true

看到這里可能你已經有思路了,就是去改變這幾個屬性,還有在getter和setter中做文章

對於不可重復賦值,我們可以設置其configurable為false,同時 set中判斷是否重復賦值,如果是即報錯,而塊級作用域可以用對象作為容器創造函數作用域代替 而如何修改這些屬性呢,可以使用Object.defineProperty() 方法

Object.defineProperty(obj, prop, descriptor):會直接在一個對象上定義一個新屬性,或者修改一個對象的現有屬性,並返回此對象。

obj:要定義屬性的對象

prop:要定義或修改的屬性的名稱

descriptor:要定義或修改的屬性描述符

function _const(key, value) {
  window[key] = value;
  Object.defineProperty(window, key, {
    enumerable: false,
    configurable: false,
    get: function () {
      return value;
    },
    set: function (newValue) {
      if (newValue !== value) {
        throw TypeError("這是只讀變量,不可修改");
      } else {
        return value;
      }
    },
  });
}

 


轉自:https://blog.csdn.net/m0_46436992/article/details/117510970?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_baidulandingword-4&spm=1001.2101.3001.4242




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM