淺談JS如何實(shí)現(xiàn)真正的對(duì)象常量
前言
眾所周知ES6新增的const關(guān)鍵字可以用來(lái)聲明常量,但是它只對(duì)基本數(shù)據(jù)類型生效(Number、String、Boolean等),那如果我們想聲明一個(gè)常量對(duì)象呢?該如何實(shí)現(xiàn),Object內(nèi)置對(duì)象早就替我們想到了,下面來(lái)具體看一下
正題
一、先來(lái)看一下const方式來(lái)聲明基本類型常量
代碼:
const name = 'jack' name = 'lucy' // 修改name常量
運(yùn)行結(jié)果:

可以看到,控制臺(tái)報(bào)錯(cuò)了,所以基本類型常量一旦聲明復(fù)制,就不能在被修改
二、再來(lái)用const方式來(lái)聲明復(fù)雜類型常量(即對(duì)象常量)
代碼:
const Obj = {
name: 'jack'
}
Obj.name = 'lucy' // 修改屬性
Obj.age = 23 // 擴(kuò)展屬性
console.log(Obj.name)
console.log(Obj.age)
delete Obj.age
console.log(Obj.age) // 刪除屬性
Obj = {
name: 'sam'
}
運(yùn)行結(jié)果:

結(jié)果表明:對(duì)象常量只是不允許修改引用地址,但是屬性還是可以被修改、擴(kuò)展和刪除的
要想得到一個(gè)真正的對(duì)象常量,我們無(wú)非要做的就是以下三點(diǎn):
1.對(duì)象的屬性不得被擴(kuò)展
2.對(duì)象的屬性不得被刪除
3.對(duì)象的屬性不得被修改
(1) 首先,如何做的對(duì)象屬性不會(huì)被擴(kuò)展呢?我們可以用Object.preventExtensions方法做到這一點(diǎn)
代碼:
var Obj = {
name: 'jack'
}
Object.preventExtensions(Obj)
Obj.age = 23 // 擴(kuò)展屬性
console.log(Obj.age) // undefined(說(shuō)明擴(kuò)展失敗了)
運(yùn)行結(jié)果:

(2) 接著,擴(kuò)展的問(wèn)題解決了,那如何實(shí)現(xiàn)屬性不會(huì)被刪除呢?不必?fù)?dān)心,我們有Object.seal方法,該方法不僅可以保證對(duì)象的屬性不會(huì)被擴(kuò)展,而且還能防止屬性被刪除
代碼:
var Obj = {
name: 'jack'
}
Object.seal(Obj)
Obj.age = 23 // 擴(kuò)展屬性
console.log(Obj.age) // undefined(說(shuō)明擴(kuò)展失敗了)
delete Obj.name // 刪除屬性
console.log(Obj.name) // 'jack'(說(shuō)明刪除失敗了)
運(yùn)行結(jié)果:

(3) 擴(kuò)展和刪除的問(wèn)題都已經(jīng)得到了解決,就剩下屬性不得被修改的問(wèn)題了,那么我們清楚終極Boss:Object.freeze,它可以做的對(duì)象既不可被擴(kuò)展和刪除,而且還不被修改
代碼:
var Obj = {
name: 'jack'
}
Object.freeze(Obj)
Obj.age = 23 // 擴(kuò)展屬性
console.log(Obj.age) // undefined(說(shuō)明擴(kuò)展失敗了)
delete Obj.name // 刪除屬性
console.log(Obj.name) // 'jack'(說(shuō)明刪除失敗了)
Obj.name = 'lucy' // 修改屬性
console.log(Obj.name) // 'jack'(說(shuō)明修改失?。?/pre>
運(yùn)行截圖:

/***************************分割線*******************************/
以上就是一步步的演示如何實(shí)現(xiàn)一個(gè)真正的對(duì)象常量,但是有如下兩個(gè)問(wèn)題:
1.如果我們調(diào)用了這三個(gè)方法中的任何一個(gè),然后我們?cè)偃プ鏊鼈兯沟男袨椋╬reventExtensions禁止擴(kuò)展屬性,seal禁止刪除屬性,freeze禁止修改屬性),那么,如果在嚴(yán)格模式下,程序會(huì)報(bào)錯(cuò),所以我們要謹(jǐn)慎使用
2.Object.freeze雖然實(shí)現(xiàn)了真正的對(duì)象常量,但是它的一切操作只在頂級(jí)對(duì)象屬性上生效,下面的代碼說(shuō)明了這一問(wèn)題
代碼:
var Obj = {
name: 'jack',
extraInfo: {
age: 23
}
}
Object.freeze(Obj)
Obj.extraInfo.age = 80
console.log(Obj.extraInfo.age) // 80
運(yùn)行截圖:

所以要想真正實(shí)現(xiàn)常量對(duì)象,我們需要以樹(shù)的形式把對(duì)象的子孫對(duì)象都freeze,Object.freeze和遞歸可以解決該問(wèn)題
// constantize實(shí)現(xiàn)遞歸freeze
var constantize = (obj) => {
Object.freeze(obj);
Object.keys(obj).forEach( (key, i) => {
if ( typeof obj[key] === 'object' ) {
constantize( obj[key] );
}
});
}
var Obj = {
name: 'jack',
extraInfo: {
age: 23
}
}
constantize(Obj)
Obj.extraInfo.age = 80
console.log(Obj.extraInfo.age) // 23
結(jié)語(yǔ)
以上就是常量對(duì)象的一些知識(shí)點(diǎn),日常開(kāi)發(fā)中,我們可以引入對(duì)象常量這個(gè)概念,來(lái)配置默認(rèn)參數(shù)對(duì)象或一些配置信息,使我們的代碼更加嚴(yán)謹(jǐn)
這篇淺談JS如何實(shí)現(xiàn)真正的對(duì)象常量就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
十個(gè)優(yōu)秀的Ajax/Javascript實(shí)例網(wǎng)站收集
今天,要向大家推薦10個(gè)相當(dāng)棒的Ajax和Javascript國(guó)外資源網(wǎng)站或博客,它們提供了相當(dāng)多的高質(zhì)量Ajax、Javascript實(shí)例及教程,喜歡Ajax和Javascript的朋友絕對(duì)不能錯(cuò)過(guò)。2010-03-03
微信小程序scroll-view點(diǎn)擊項(xiàng)自動(dòng)居中效果的實(shí)現(xiàn)
這篇文章主要介紹了微信小程序scroll-view點(diǎn)擊項(xiàng)自動(dòng)居中效果的實(shí)現(xiàn)代碼,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03
純JavaScript實(shí)現(xiàn)實(shí)時(shí)反饋系統(tǒng)時(shí)間
這篇文章主要介紹了純JavaScript實(shí)現(xiàn)實(shí)時(shí)反饋系統(tǒng)時(shí)間的相關(guān)資料,需要的朋友可以參考下2017-10-10
JS公共小方法之判斷對(duì)象是否為domElement的實(shí)例
下面小編就為大家?guī)?lái)一篇JS公共小方法之判斷對(duì)象是否為domElement的實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-11-11
前端實(shí)現(xiàn)文本超出指定行數(shù)顯示"展開(kāi)"和"收起"效果詳細(xì)步驟
本文介紹如何使用JavaScript原生代碼實(shí)現(xiàn)文本折疊展開(kāi)效果,并提供方法指導(dǎo)如何在Vue或React等框架中修改實(shí)現(xiàn),詳細(xì)介紹了創(chuàng)建整體框架、設(shè)置樣式及利用JS控制元素的步驟,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-10-10
JavaScript實(shí)現(xiàn)抖音羅盤時(shí)鐘
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)抖音羅盤時(shí)鐘,特別實(shí)用的效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-10-10
js左側(cè)多級(jí)菜單動(dòng)態(tài)的解決方案
實(shí)現(xiàn)的效果很簡(jiǎn)單,就是點(diǎn)一下顯示,再點(diǎn)一下就隱藏,只不過(guò)是多了幾級(jí)的問(wèn)題。好,現(xiàn)在來(lái)說(shuō)說(shuō)我的設(shè)計(jì)思路,首先從第一級(jí)別開(kāi)始,添加如下代碼2010-02-02

