這篇文章主要介紹了JavaScrip如何創(chuàng)建常量,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
成都創(chuàng)新互聯(lián)專(zhuān)注于通河企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站建設(shè),商城系統(tǒng)網(wǎng)站開(kāi)發(fā)。通河網(wǎng)站建設(shè)公司,為通河等地區(qū)提供建站服務(wù)。全流程按需制作網(wǎng)站,專(zhuān)業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,成都創(chuàng)新互聯(lián)專(zhuān)業(yè)和態(tài)度為您提供的服務(wù)
所謂常量即只能讀取不能編輯(刪除,修改)的變量。
js并沒(méi)有原始的常量說(shuō)法(即自定義的,原生態(tài)的),但是可以用一些偏僻的路子去創(chuàng)建。
1:const es6中的聲明關(guān)鍵詞。
上面聲明了兩個(gè)變量,當(dāng)執(zhí)行修改操作時(shí)就將報(bào)錯(cuò)。從某種程度上來(lái)說(shuō),const是可以創(chuàng)建變量(基本類(lèi)型)的。但是對(duì)引用類(lèi)型就捉襟見(jiàn)肘。
當(dāng)聲明的變量是一個(gè)引用類(lèi)型時(shí)即對(duì)象,對(duì)對(duì)象的操作(刪除,修改,添加)都是可以進(jìn)行的。
2:Object 方法(defineProperty,seal,freeze)實(shí)現(xiàn)
1) Object.defineProperty: 該方法會(huì)直接在一個(gè)對(duì)象上定義一個(gè)新屬性,或者修改一個(gè)對(duì)象的現(xiàn)有屬性, 并返回這個(gè)對(duì)象。
采用上述方法之后后續(xù)對(duì)a的修改功能就失效了,雖然修改功能不能正常執(zhí)行, 但是刪除功能卻還是可以照常進(jìn)行。
刪除之后繼續(xù)添加a屬性時(shí),a又變成可改的了。上述只是將a屬性的可寫(xiě)屬性改了,還有一個(gè)configurable屬性可以進(jìn)行設(shè)置。writable屬性只是將對(duì)應(yīng)的屬性變更為不可直接更改,但是可以走小路(先刪除在添加)。
到此屬性a就算定下來(lái)了,及不能修改,也不能刪除。
但是,新的風(fēng)暴有出現(xiàn)了。。。a雖然定下來(lái)了,但對(duì)于TEST_D這個(gè)變量來(lái)說(shuō),還沒(méi)有結(jié)束。。。
雖然屬性a不能變動(dòng)了,但是并不影響對(duì)其他屬性的操作,比如b,s,u啊的,當(dāng)然針對(duì)這些屬性也可以像上述方式一樣將其余屬性的描述符,但是還是不能解決對(duì)TEST_D的擴(kuò)展。
2) Object.preventExtensions: 該方法讓一個(gè)對(duì)象變的不可擴(kuò)展,也就是永遠(yuǎn)不能再添加新的屬性。 查看詳情
通過(guò)該方法就可以將對(duì)象設(shè)置為不可擴(kuò)展了,即不可添加新屬性了,這樣這個(gè)變量就不能被修改了。
3)Object.seal:讓一個(gè)對(duì)象密封并返回被密封之后的對(duì)象,新對(duì)象將變得不可擴(kuò)展,即不能添加新的屬性但是可以修改原本可寫(xiě)狀態(tài)的屬性
利用上述兩種方法循環(huán)使用是可以去創(chuàng)建常量的,但是比較復(fù)雜,而且當(dāng)對(duì)象比較大的時(shí)候,代碼量會(huì)比較大。Object.seal()可以簡(jiǎn)化這個(gè)過(guò)程。這個(gè)方法可以將對(duì)象變得不可擴(kuò)展,屬性不可刪除。在此基礎(chǔ)上在將對(duì)象的所有屬性的描述符writable改為false就能得到我們要的變量了,即所謂常量。
4) Object.freeze: 該方法可以?xún)鼋Y(jié)一個(gè)對(duì)象,凍結(jié)指的是不能向這個(gè)對(duì)象添加新的屬性,不能修改其已有屬性的值,不能刪除已有屬性,以及不能修改該對(duì)象已有屬性的可枚舉性、可配置性、可寫(xiě)性。也就是說(shuō),這個(gè)對(duì)象永遠(yuǎn)是不可變的。該方法返回被凍結(jié)的對(duì)象。
Object.freeze方法是在seal基礎(chǔ)上在將所有屬性的描述符writable改為false。
但是當(dāng)變量的屬性值又為對(duì)象時(shí),及下列情況:
對(duì)于user屬性而言,他的值是還是可以更改的,這個(gè)時(shí)候就得對(duì)他也進(jìn)行凍結(jié)。
/** * * * @param {any} obj */ function freezeObj(obj) { Object.freeze(obj); Object.keys(obj).forEach(key => { if (typeof obj[key] === 'object') { freezeObj(obj[key]) } }) }
即:當(dāng)存在多重對(duì)象時(shí),需要循環(huán)調(diào)用凍結(jié)方法。
3: 閉包
const USER = (() => { const USER = { name: 'evening', gender: 'M' } return { get(name){ return user[name] } } })() USER.get('name')
閉包用了比較隱秘的方法,將真正的對(duì)象原型保存在內(nèi)存中而且不會(huì)被回收,變相的將USER這個(gè)變量‘保護(hù)'起來(lái),并且提供訪問(wèn)的接口,但是不提供修改的接口。
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“JavaScrip如何創(chuàng)建常量”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來(lái)學(xué)習(xí)!