亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

前端如何定義一個(gè)常量

widuu / 3261人閱讀

摘要:很多編程語(yǔ)言提供了關(guān)鍵詞聲明一個(gè)常量,在中也是提供了,但是在前端的與其他編程語(yǔ)言不同,其并不意味著聲明的變量就是一個(gè)常量。所以,在前端中到底如何實(shí)現(xiàn)一個(gè)常量可以凍結(jié)對(duì)象,不能新增和刪除屬性,同時(shí)對(duì)象已有屬性都是不可枚舉不可配置不可寫(xiě)。

很多編程語(yǔ)言提供了const關(guān)鍵詞聲明一個(gè)常量,在ES6中也是提供了const,但是在前端的const與其他編程語(yǔ)言不同,其并不意味著聲明的變量就是一個(gè)常量。使用const b = {}聲明了一個(gè)常量b,但是通過(guò)使用b.a = 1去修改對(duì)象b卻并沒(méi)有報(bào)錯(cuò),我們修改了一個(gè)原本以為是常量實(shí)際上是變量的對(duì)象。

為什么會(huì)這樣?

實(shí)際上,const定義的變量保存的是指向?qū)嶋H數(shù)據(jù)的指針,對(duì)于基本數(shù)據(jù)類型String、Boolean、Number、undefined、null、Symbol而言,
其值保存在棧內(nèi)存中的簡(jiǎn)單數(shù)據(jù)段,按值訪問(wèn),就是等同于常量。但是相對(duì)于引用數(shù)據(jù)類型而言,const只能保證指向保存在堆內(nèi)存中的對(duì)象的指針保持不變,換句話說(shuō)
const能夠保證變量始終指向同一個(gè)對(duì)象,至于對(duì)象的修改無(wú)能為力。

所以,在前端中到底如何實(shí)現(xiàn)一個(gè)常量!

Object.freeze

Object.freeze可以凍結(jié)對(duì)象,不能新增和刪除屬性,同時(shí)對(duì)象已有屬性都是不可枚舉、不可配置、不可寫(xiě)。需要注意的是使用該方法只能讓對(duì)象淺凍結(jié),其內(nèi)部屬性為對(duì)象時(shí)
依然能夠被篡改,要想實(shí)現(xiàn)完全凍結(jié),那么就需要進(jìn)行如下操作。

function deepConst(data){
  Object.freeze(data);
  for(let key in data){
    let prop = data[key];
    if(!data.hasOwnProperty(key) || !(typeof prop === "object") || Object.isFrozen(prop)){
      continue;
    }
    deepConst(prop);
  }
}
Object.defineProperty、Object.preventExtensions、Object.seal Object.preventExtensions

該方法可以將對(duì)象變?yōu)椴豢蓴U(kuò)展即對(duì)象即不能添加新的屬性,但是對(duì)象的原有屬性依然可以被刪除或修改,同時(shí)如果屬性的值為對(duì)象,盡管設(shè)置了
不能被添加屬性,但是其屬性值為對(duì)象的屬性依舊可以添加屬性。

舉個(gè)例子:

let obj = {a:1,b:2,c:{d:3}};
Object.preventExtensions(obj);
obj.d = 1;
obj.a = 2;
delete obj.b;
obj.c.e = 10;
//輸出{a:1,c:{d:3,e:10}
console.log(obj);
Object.seal

Object.preventExtensions相比,該方法同樣能夠?qū)?duì)象變?yōu)椴荒芴砑有聦傩?,并且該方法禁止刪除對(duì)象的屬性。同樣如果屬性的值為對(duì)象,
屬性值依舊可以添加新屬性或刪除屬性。

舉個(gè)例子

let obj = {a:1,b:2,c:{d:3}};
Object.seal(obj);
obj.e = 10;
delete obj.a;
delete obj.c.d;
obj.c.f = 10;
//輸出{a:1,b:2,c:{f:10}
console.log(obj);
Object.defineProperty

Object.defineProperty(obj, prop, descriptor)在MVVM中大放異彩,使用其也能夠?qū)?duì)象完整凍結(jié)。在寫(xiě)代碼之前我們
先了解下writable、Configurable需要知道都內(nèi)容,這才是此次凍結(jié)的關(guān)鍵。

writable

對(duì)象屬性的值是否能夠被重寫(xiě),為true表示允許,為false即被禁止,默認(rèn)為false。如果屬性的值為對(duì)象,
盡管設(shè)置了不能被重寫(xiě),其屬性為對(duì)象的值依舊能夠被重寫(xiě)。

舉個(gè)例子:

let obj = {a:1,b:2,c:{d:3}};
Object.defineProperty(obj,"a",{writable:true});
Object.defineProperty(obj,"b",{writable:false});
Object.defineProperty(obj,"c",{writable:false});
Object.defineProperty(obj,"e",{writable:false});
obj.a = 2;
obj.b = 3;
obj.c.d = 4;
//輸出為2,即a屬性的值被重寫(xiě)了
console.log(obj.a);
//輸出依然為2,即b屬性的值沒(méi)有被重寫(xiě)
console.log(obj.b);
//輸出依然為{d:4},如果屬性的值為對(duì)象,盡管設(shè)置了不能被重寫(xiě),其屬性為對(duì)象的值依舊能夠被重寫(xiě)。
console.log(obj.c);
Configurable

configurable特性表示對(duì)象的屬性是否可以被刪除,以及除writable特性外的其他特性是否可以被修改。為true表示允許被修改
false表示禁止修改,默認(rèn)為false,如果屬性的值為對(duì)象,盡管設(shè)置了屬性不能被修改,其屬性為對(duì)象的屬性依舊能夠被修改。
舉個(gè)例子

let obj = {a:1,b:2,c:{d:3}};
Object.defineProperty(obj,"a",{configurable:true});
Object.defineProperty(obj,"b",{configurable:false});
Object.defineProperty(obj,"c",{configurable:false});
delete obj.a;
delete obj.b;
delete obj.c;
//輸出 {b:2,c:{}},如果屬性的值為對(duì)象,盡管設(shè)置了屬性不能被修改,其屬性為對(duì)象的屬性依舊能夠被修改。
console.log(obj);

上面這三個(gè)方法多帶帶拿出來(lái)并不能夠完美的將對(duì)象變?yōu)橐粋€(gè)常量,但是我們組合一下就可以生成一個(gè)常量。

function deepConst(data){
  if (!data || typeof data !== "object") {
    return;
  }
  //Object.preventExtensions(data);也可以實(shí)現(xiàn)
  Object.seal(data);
  Object.keys(data).forEach(function(key) {
    unWriteConfig(data, key, data[key]);
  });
}
function unWriteConfig(data, key, val) {
  deepConst(val);
  Object.defineProperty(data, key, {
    writable:false,
    configurable:false
  });
}
Proxy

Proxy在目標(biāo)對(duì)象之前進(jìn)行了一層攔截,外界對(duì)對(duì)象的訪問(wèn)和修改都需要通過(guò)這層攔截,所以我們可以操控?cái)r截來(lái)控制對(duì)對(duì)象對(duì)訪問(wèn)和修改。Proxy
支持的攔截操作眾多,下面只列舉與文章相關(guān)的操作,如果想更深入了解Proxy,請(qǐng)看這篇文章。

function createDeepProxy(target) {
  function makeHandler() {
    return {
      set(target, key, value, receiver) {
        return false;
      },
      deleteProperty(target, key) {
        return false;
      }
    }
  }
  
  function proxify(obj, path) {
    for(let key of Object.keys(obj)) {
      if(typeof obj[key] === "object") {
        obj[key] = proxify(obj[key], [...path, key]);
      }
    }
    let p = new Proxy(obj, makeHandler());
    return p;
  }
  return proxify(target, []);
}

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/102535.html

相關(guān)文章

  • 前端如何保護(hù)共享對(duì)象

    摘要:只要保證在開(kāi)發(fā)中沒(méi)有對(duì)共享對(duì)象的寫(xiě)入操作,那么發(fā)布到線上時(shí)肯定也沒(méi)有寫(xiě)入操作,這時(shí)候這個(gè)保護(hù)方法就是多余的。 什么是共享對(duì)象 被多次使用到的同一個(gè)對(duì)象即為共享對(duì)象 比如我們用標(biāo)準(zhǔn)的es模塊來(lái)寫(xiě)一個(gè)導(dǎo)出單位轉(zhuǎn)換的模塊 //converter module export default { cmToIn(){ //convert logic } } 當(dāng)我們?cè)?..

    solocoder 評(píng)論0 收藏0
  • 一只前端小白的JS note

    摘要:是一個(gè)運(yùn)行在瀏覽器端的腳本語(yǔ)言現(xiàn)在已經(jīng)不僅僅局限于瀏覽器端是一門(mén)解釋型動(dòng)態(tài)類型的語(yǔ)言解釋型指語(yǔ)言在執(zhí)行時(shí)不需要編譯,由瀏覽器自動(dòng)編譯基本語(yǔ)法區(qū)分大小寫(xiě)是一種區(qū)分大小寫(xiě)的語(yǔ)言定義變量名稱一般用小寫(xiě)定義常量名稱一般用大寫(xiě)空格和換行中會(huì) JavaScript - JavaScript是一個(gè)運(yùn)行在瀏覽器端的腳本語(yǔ)言(現(xiàn)在已經(jīng)不僅僅局限于瀏覽器端) - JavaScript是一門(mén)解釋型、動(dòng)態(tài)類型...

    chavesgu 評(píng)論0 收藏0
  • 【進(jìn)階1-5期】JavaScript深入之4類常見(jiàn)內(nèi)存泄漏及如何避免

    摘要:本期推薦文章類內(nèi)存泄漏及如何避免,由于微信不能訪問(wèn)外鏈,點(diǎn)擊閱讀原文就可以啦。四種常見(jiàn)的內(nèi)存泄漏劃重點(diǎn)這是個(gè)考點(diǎn)意外的全局變量未定義的變量會(huì)在全局對(duì)象創(chuàng)建一個(gè)新變量,如下。因?yàn)槔习姹镜氖菬o(wú)法檢測(cè)節(jié)點(diǎn)與代碼之間的循環(huán)引用,會(huì)導(dǎo)致內(nèi)存泄漏。 (關(guān)注福利,關(guān)注本公眾號(hào)回復(fù)[資料]領(lǐng)取優(yōu)質(zhì)前端視頻,包括Vue、React、Node源碼和實(shí)戰(zhàn)、面試指導(dǎo)) 本周正式開(kāi)始前端進(jìn)階的第一期,本周的主題...

    red_bricks 評(píng)論0 收藏0
  • 前端知識(shí)點(diǎn)總結(jié)——JS基礎(chǔ)

    摘要:語(yǔ)法常量名值常量名在程序中,通常采用大寫(xiě)形式。結(jié)果為類型作用表示使用的數(shù)據(jù)不存在類型只有一個(gè)值即當(dāng)聲明的變量未賦值未初始化時(shí),該變量的默認(rèn)值就是類型用于表示不存在的對(duì)象。結(jié)果為按位或,對(duì)小數(shù)取整將任意小數(shù)與做按位或,結(jié)果則取整數(shù)部分。 前端知識(shí)點(diǎn)總結(jié)——JS基礎(chǔ) 1.javascript概述(了解) 1.什么是javascript javascript簡(jiǎn)稱為js,是一種運(yùn)行于js解釋器...

    wangbjun 評(píng)論0 收藏0
  • 前端代碼規(guī)范筆記

    摘要:代碼規(guī)范編碼基本要求縮進(jìn)量為個(gè)字節(jié)循環(huán)分支層次不要超過(guò)層空行和空白字符也是一種特殊注釋判斷條件,多用保證類型和值者一致所有變量在調(diào)用前必須被初始化對(duì)所有的用戶輸入,必須進(jìn)行合法性檢查。一個(gè)方法的圈復(fù)雜度推薦最大為,多了請(qǐng)重構(gòu)。 javaScript 代碼規(guī)范 編碼基本要求 1縮進(jìn)量 tab為4個(gè)字節(jié) 2循環(huán)、分支層次不要超過(guò) 3 層3空行和空白字符也是一種特殊注釋4判斷條件,多用...

    李增田 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<