如何讓對(duì)象屬性不可配置或枚舉

一、什么是屬性描述符梅桩?

MDN:

對(duì)象里目前存在的屬性描述符有兩種主要形式:數(shù)據(jù)描述符和存取描述符壹粟。

數(shù)據(jù)描述符是一個(gè)擁有可寫(xiě)或不可寫(xiě)值的屬性。

存取描述符是由一對(duì) getter-setter 函數(shù)功能來(lái)描述的屬性宿百。

描述符必須是兩種形式之一趁仙;不能同時(shí)是兩者。

數(shù)據(jù)描述符和存取描述符均具有以下可選鍵值:

value 與屬性相關(guān)的值垦页∪阜眩可以是任何有效的 JavaScript 值(數(shù)值,對(duì)象痊焊,函數(shù)等)盏袄。默認(rèn)為 undefined。?

writable true 當(dāng)且僅當(dāng)可能用賦值運(yùn)算符改變與屬性相關(guān)的值薄啥。默認(rèn)為 false辕羽。

存取描述符同時(shí)具有以下可選鍵值:

get

一個(gè)給屬性提供 getter 的方法,如果沒(méi)有 getter 則為 undefined垄惧。方法將返回用作屬性的值逛漫。默認(rèn)為 undefined。 set 一個(gè)給屬性提供 setter 的方法赘艳,如果沒(méi)有 setter 則為 undefined酌毡。該方法將收到作為唯一參數(shù)的新值分配給屬性。默認(rèn)為 undefined蕾管。

以上是摘自MDN的解釋枷踏,看起來(lái)是很晦澀的,具體什么意思呢: 首先我們從以上解釋知道該匿名參數(shù)對(duì)象有個(gè)很好聽(tīng)的名字叫屬性描述符掰曾,屬性描述符又分成兩大塊:數(shù)據(jù)描述符以及存取描述符(其實(shí)只是一個(gè)外號(hào)旭蠕,給指定的屬性集合起個(gè)外號(hào))。

數(shù)據(jù)描述符包括兩個(gè)屬性 :value屬性以及writable屬性旷坦,第一個(gè)屬性用來(lái)聲明當(dāng)前欲修飾的屬性的值掏熬,第二個(gè)屬性用來(lái)聲明當(dāng)前對(duì)象是否可寫(xiě)即是否可以修改

存取描述符就包括get與set屬性用來(lái)聲明欲修飾的象屬性的getter及setter

屬性描述符內(nèi)部,數(shù)據(jù)描述符與存取描述符只能存在其中之一秒梅,但是不論使用哪個(gè)描述符都可以同時(shí)設(shè)置configurable屬性以及enumerable屬性旗芬。

configurable屬性用來(lái)聲明欲修飾的屬性是否能夠配置,僅有當(dāng)其值為true時(shí)捆蜀,被修飾的屬性才有可能能夠被刪除疮丛,或者重新配置幔嫂。

enumerable屬性用來(lái)聲明欲修飾屬性是否可以被枚舉。

知道了什么是屬性描述符誊薄,我們就可以開(kāi)始著手創(chuàng)建一些對(duì)象并開(kāi)始配置其屬性

順便給大家推薦一個(gè)裙履恩,它的前面是 537,中間是631呢蔫,最后就是 707切心。想要學(xué)習(xí)前端的小伙伴可以加入我們一起學(xué)習(xí),互相幫助片吊。群里每天晚上都有大神免費(fèi)直播上課昙衅,如果不是想學(xué)習(xí)的小伙伴就不要加啦。

二定鸟、創(chuàng)建屬性不可配置不可枚舉的對(duì)象

//使用默認(rèn)值配置

(function(){

varobj?=?{};//聲明一個(gè)空對(duì)象

Object.defineProperty(obj,"key",{

value:"static"

//沒(méi)有設(shè)置?enumerable?使用默認(rèn)值?false

//沒(méi)有?configurable?使用默認(rèn)值?false

//沒(méi)有?writable?使用默認(rèn)值?false

});

console.log(obj.key);//輸出?“static”

obj.key?="new"http://嘗試修改其值,修改將失敗,因?yàn)?writable?為?false

console.log(obj.key);//輸出?“static”

obj.a?=1;//動(dòng)態(tài)添加一個(gè)屬性

for(variteminobj){//遍歷所有?obj?的可枚舉屬性

console.log(item);

}//只輸出一個(gè)?“a”?因?yàn)?“key”的?enumerable為?false

})();

//顯示配置?等價(jià)于上面

(function(){

varobj?=?{};

Object.defineProperty(obj,"key",{

enumerable:false,

configurable:false,

writable:false,

value:"static"

})

})();

//等價(jià)配置

(function(){

varo?=?{};

o.a?=1;

//等價(jià)于

Object.defineProperty(o,"a",{value:1,

writable:true,

configurable:true,

enumerable:true});

Object.defineProperty(o,"a",{value:1});

//等價(jià)于

Object.defineProperty(o,"a",{value:1,

writable:false,

configurable:false,

enumerable:false});

})();

三、Enumerable 特性

屬性特性enumerable決定屬性是否能被for...in循環(huán)或Object.keys方法遍歷得到

(function(){

varo?=?{};

Object.defineProperty(o,"a",{value:1,enumerable:true});

Object.defineProperty(o,"b",{value:2,enumerable:false});

Object.defineProperty(o,"c",{value:2});//enumerable?default?to?false

o.d?=4;//如果直接賦值的方式創(chuàng)建對(duì)象的屬性,則這個(gè)屬性的?enumerable?為?true

for(varitemino){//遍歷所有可枚舉屬性包括繼承的屬性

console.log(item);

}

console.log(Object.keys(o));//獲取?o?對(duì)象的所有可遍歷屬性不包括繼承的屬性

console.log(o.propertyIsEnumerable('a'));//true

console.log(o.propertyIsEnumerable('b'));//false

console.log(o.propertyIsEnumerable('c'));//false

})();

輸出結(jié)果如下:

四著瓶、Configurable 特性

(function(){

varo?=?{};

Object.defineProperty(o,"a",{get:function(){return1;},

configurable:false}?);

//enumerable?默認(rèn)為?false,

//value?默認(rèn)為?undefined,

//writable?默認(rèn)為?false,

//set?默認(rèn)為?undefined

//拋出異常,因?yàn)樽铋_(kāi)始定義了?configurable?為?false,故后期無(wú)法對(duì)其進(jìn)行再配置

Object.defineProperty(o,"a",{configurable:true}?);

//拋出異常,因?yàn)樽铋_(kāi)始定義了?configurable?為?false,故后期無(wú)法對(duì)其進(jìn)行再配置,enumerable?的原值為?false

Object.defineProperty(o,"a",{enumerable:true}?);

//拋出異常,因?yàn)樽铋_(kāi)始定義了?configurable?為?false,set的原值為?undefined

Object.defineProperty(o,"a",{set:function(val){}}?);

//拋出異常,因?yàn)樽铋_(kāi)始定義了?configurable?為?false,故無(wú)法進(jìn)行覆蓋,盡管想用一樣的來(lái)覆蓋

Object.defineProperty(o,"a",{get:function(){return1}});

//拋出異常联予,因?yàn)樽铋_(kāi)始定義了?configurable?為?false,故無(wú)法將其進(jìn)行重新配置把屬性描述符從存取描述符改為數(shù)據(jù)描述符

Object.defineProperty(o,"a",{value:12});

console.log(o.a);//輸出1

deleteo.a;//想要?jiǎng)h除屬性,將失敗

console.log(o.a);//輸出1

})();

五、提高及擴(kuò)展

1.屬性描述符中容易被誤導(dǎo)的地方之writable與configurable

(function(){

varo?=?{};

Object.defineProperties(o,{

"a":?{

value:1,

writable:true,//可寫(xiě)

configurable:false//不可配置

//enumerable?默認(rèn)為?false?不可枚舉

},

"b":{

get:function(){

returnthis.a;

},

configurable:false

}

});

console.log(o.a);//1

o.a?=2;//修改值成功,writable?為?true

console.log(o.a);//2

Object.defineProperty(o,"a",{value:3});//同樣為修改值成功

console.log(o.a);//3

//將其屬性?b?的屬性描述符從存取描述符重新配置為數(shù)據(jù)描述符

Object.defineProperty(o,"b",{value:3});//拋出異常,因?yàn)?configurable?為?false

})();

2.通過(guò)上面的學(xué)習(xí)材原,我們都知道傳遞屬性描述符參數(shù)時(shí)沸久,是定義一個(gè)匿名的對(duì)象,里面包含屬性描述符內(nèi)容余蟹,若每定義一次便要?jiǎng)?chuàng)建一個(gè)匿名對(duì)象傳入卷胯,將會(huì)造成內(nèi)存浪費(fèi)。故優(yōu)化如下:

(function(){

varobj?=?{};

//回收同一對(duì)象,即減少內(nèi)存浪費(fèi)

functionwithValue(value){

vard?=?withValue.d?||(

withValue.d?=?{

enumerable:false,

configurable:false,

writable:false,

value:null

}

);

d.value?=?value;

returnd;

}

Object.defineProperty(obj,"key",withValue("static"))

})();

最后給大家推薦一個(gè)裙威酒,它的前面是 537窑睁,中間是631,最后就是 707葵孤。想要學(xué)習(xí)前端的小伙伴可以加入我們一起學(xué)習(xí)担钮,互相幫助。群里每天晚上都有大神免費(fèi)直播上課尤仍,如果不是想學(xué)習(xí)的小伙伴就不要加啦箫津。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市宰啦,隨后出現(xiàn)的幾起案子苏遥,更是在濱河造成了極大的恐慌,老刑警劉巖赡模,帶你破解...
    沈念sama閱讀 219,427評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件田炭,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡漓柑,警方通過(guò)查閱死者的電腦和手機(jī)诫肠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)司澎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人栋豫,你說(shuō)我怎么就攤上這事挤安。” “怎么了丧鸯?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,747評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵蛤铜,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我丛肢,道長(zhǎng)围肥,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,939評(píng)論 1 295
  • 正文 為了忘掉前任蜂怎,我火速辦了婚禮穆刻,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘杠步。我一直安慰自己氢伟,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布幽歼。 她就那樣靜靜地躺著朵锣,像睡著了一般。 火紅的嫁衣襯著肌膚如雪甸私。 梳的紋絲不亂的頭發(fā)上诚些,一...
    開(kāi)封第一講書(shū)人閱讀 51,737評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音皇型,去河邊找鬼诬烹。 笑死,一個(gè)胖子當(dāng)著我的面吹牛弃鸦,可吹牛的內(nèi)容都是我干的椅您。 我是一名探鬼主播,決...
    沈念sama閱讀 40,448評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼寡键,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼掀泳!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起西轩,我...
    開(kāi)封第一講書(shū)人閱讀 39,352評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤员舵,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后藕畔,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體马僻,經(jīng)...
    沈念sama閱讀 45,834評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評(píng)論 3 338
  • 正文 我和宋清朗相戀三年注服,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了韭邓。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片措近。...
    茶點(diǎn)故事閱讀 40,133評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖女淑,靈堂內(nèi)的尸體忽然破棺而出瞭郑,到底是詐尸還是另有隱情,我是刑警寧澤鸭你,帶...
    沈念sama閱讀 35,815評(píng)論 5 346
  • 正文 年R本政府宣布屈张,位于F島的核電站,受9級(jí)特大地震影響袱巨,放射性物質(zhì)發(fā)生泄漏阁谆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評(píng)論 3 331
  • 文/蒙蒙 一愉老、第九天 我趴在偏房一處隱蔽的房頂上張望场绿。 院中可真熱鬧,春花似錦嫉入、人聲如沸焰盗。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,022評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至逗宁,卻和暖如春映九,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背瞎颗。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,147評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工件甥, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人哼拔。 一個(gè)月前我還...
    沈念sama閱讀 48,398評(píng)論 3 373
  • 正文 我出身青樓引有,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親倦逐。 傳聞我的和親對(duì)象是個(gè)殘疾皇子譬正,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 概述 JavaScript提供了一個(gè)內(nèi)部數(shù)據(jù)結(jié)構(gòu),用來(lái)描述一個(gè)對(duì)象的屬性的行為檬姥,控制它的行為曾我。這被稱為“屬性描述對(duì)...
    zjh111閱讀 726評(píng)論 0 0
  • 概述 JavaScript提供了一個(gè)內(nèi)部數(shù)據(jù)結(jié)構(gòu),用來(lái)描述一個(gè)對(duì)象的屬性的行為健民,控制它的行為抒巢。這被稱為“屬性描述對(duì)...
    許先生__閱讀 490評(píng)論 0 1
  • 盡管javascript里有大量?jī)?nèi)建引用對(duì)象,很可能你還說(shuō)會(huì)頻繁創(chuàng)建自己的對(duì)象秉犹。當(dāng)你在這么做的時(shí)候蛉谜,記得javas...
    WanLum閱讀 533評(píng)論 1 3
  • (注1:如果有問(wèn)題歡迎留言探討稚晚,一起學(xué)習(xí)!轉(zhuǎn)載請(qǐng)注明出處型诚,喜歡可以點(diǎn)個(gè)贊哦?脱唷)(注2:更多內(nèi)容請(qǐng)查看我的目錄。) ...
    love丁酥酥閱讀 1,861評(píng)論 4 7
  • 函數(shù)和對(duì)象 1俺驶、函數(shù) 1.1 函數(shù)概述 函數(shù)對(duì)于任何一門(mén)語(yǔ)言來(lái)說(shuō)都是核心的概念幸逆。通過(guò)函數(shù)可以封裝任意多條語(yǔ)句,而且...
    道無(wú)虛閱讀 4,566評(píng)論 0 5