定義一個變量

屬性描述符(Property Descriptors)

var myObject = {
    a: 2
};

Object.getOwnPropertyDescriptor( myObject, "a" );
// {
//    value: 2,
//    writable: true,
//    enumerable: true,
//    configurable: true
// }

我們普通的對象屬性a的屬性描述符(稱為“數(shù)據(jù)描述符”,因為它僅持有一個數(shù)據(jù)值)的內容要比value為2多得多。它還包含另外3個性質:writable糜工,enumerable捕传,和configurable筐骇。

可寫性(Writable)

writable控制著你改變屬性值的能力债鸡。

var myObject = {};

Object.defineProperty( myObject, "a", {
    value: 2,
    writable: false, // 不可寫!
    configurable: true,
    enumerable: true
} );

myObject.a = 3;

myObject.a; // 2

我們對value的修改悄無聲息地失敗了

可配置性(Configurable)

只要屬性當前是可配置的铛纬,我們就可以使用同樣的defineProperty(..)工具厌均,修改它的描述符定義。

var myObject = {
    a: 2
};

myObject.a = 3;
myObject.a;                    // 3

Object.defineProperty( myObject, "a", {
    value: 4,
    writable: true,
    configurable: false,    // 不可配置告唆!
    enumerable: true
} );

myObject.a;                    // 4
myObject.a = 5;
myObject.a;                    // 5

Object.defineProperty( myObject, "a", {
    value: 6,
    writable: true,
    configurable: true,
    enumerable: true
} ); // TypeError

最后的defineProperty(..)調用導致了一個TypeError棺弊,這與strict mode無關,如果你試圖改變一個不可配置屬性的描述符定義擒悬,就會發(fā)生TypeError模她。要小心:如你所看到的,將configurable設置為false是 一個單向操作茄螃,不可撤銷缝驳!

注意: 這里有一個需要注意的微小例外:即便屬性已經(jīng)是configurable:false,writable總是可以沒有錯誤地從true改變?yōu)閒alse归苍,但如果已經(jīng)是false的話不能變回true用狱。

configurable:false阻止的另外一個事情是使用delete操作符移除既存屬性的能力。

對象常量(Object Constant)

通過將writable:false與configurable:false組合拼弃,你可以實質上創(chuàng)建了一個作為對象屬性的 常量(不能被改變夏伊,重定義或刪除),比如:

var myObject = {};

Object.defineProperty( myObject, "FAVORITE_NUMBER", {
    value: 42,
    writable: false,
    configurable: false
} );

防止擴展(Prevent Extensions)

如果你想防止一個對象被添加新的屬性吻氧,但另一方面保留其他既存的對象屬性溺忧,調用Object.preventExtensions(..):

var myObject = {
    a: 2
};

Object.preventExtensions( myObject );

myObject.b = 3;
myObject.b; // undefined

封印(Seal)和 凍結(Freeze)

Object.seal(..)創(chuàng)建一個“封印”的對象盯孙,這意味著它實質上在當前的對象上調用Object.preventExtensions(..)鲁森,同時也將它所有的既存屬性標記為configurable:false。
所以振惰,你既不能添加更多的屬性歌溉,也不能重新配置或刪除既存屬性(雖然你依然 可以 修改它們的值)。

Object.freeze(..)創(chuàng)建一個凍結的對象骑晶,這意味著它實質上在當前的對象上調用Object.seal(..)痛垛,同時也將它所有的“數(shù)據(jù)訪問”屬性設置為writable:false,所以他們的值不可改變桶蛔。

存在性(Existence)

in和hasOwnPrototype

in操作符會檢查屬性是否存在于對象中匙头,或者是否存在于[[Prototype]]鏈對象遍歷的更高層中。
相比之下仔雷,hasOwnProperty(..) 僅僅 檢查myObject是否擁有屬性蹂析,但不會查詢[[Prototype]]鏈

var myObject = {
    a: 2
};

("a" in myObject);                // true
("b" in myObject);                // false

myObject.hasOwnProperty( "a" );    // true
myObject.hasOwnProperty( "b" );    // false

枚舉(Enumeration)

var myObject = { };

Object.defineProperty(
    myObject,
    "a",
    // 使`a`可枚舉,如一般情況
    { enumerable: true, value: 2 }
);

Object.defineProperty(
    myObject,
    "b",
    // 使`b`不可枚舉
    { enumerable: false, value: 3 }
);

myObject.b; // 3
("b" in myObject); // true
myObject.hasOwnProperty( "b" ); // true

// .......

for (var k in myObject) {
    console.log( k, myObject[k] );
}

你會注意到碟婆,myObject.b實際上 存在电抚,而且擁有可以訪問的值,但是它不出現(xiàn)在for..in循環(huán)中(然而令人詫異的是脑融,它的in操作符的存在性檢查通過了)喻频。這是因為“enumerable”基本上意味著“如果對象的屬性被迭代時會被包含在內”。

Object.keys()和Object.getOwnPropertyNames() 肘迎、propertyIsEnumerable

1.Object.keys()返回一個所有可枚舉屬性的數(shù)組甥温,而Object.getOwnPropertyNames()返回一個 所有 屬性的數(shù)組,不論能不能枚舉妓布。

2.propertyIsEnumerable()測試一個給定的屬性名是否直 接存 在于對象上姻蚓,并且是enumerable:true。

var myObject = { };

Object.defineProperty(
    myObject,
    "a",
    // 使`a`可枚舉匣沼,如一般情況
    { enumerable: true, value: 2 }
);

Object.defineProperty(
    myObject,
    "b",
    // 使`b`不可枚舉
    { enumerable: false, value: 3 }
);

myObject.propertyIsEnumerable( "a" ); // true
myObject.propertyIsEnumerable( "b" ); // false

Object.keys( myObject ); // ["a"]
Object.getOwnPropertyNames( myObject ); // ["a", "b"]

in和hasOwnProperty(..)區(qū)別于它們是否查詢[[Prototype]]鏈狰挡,而Object.keys(..)和Object.getOwnPropertyNames(..)都 只 考察直接給定的對象。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市加叁,隨后出現(xiàn)的幾起案子倦沧,更是在濱河造成了極大的恐慌,老刑警劉巖它匕,帶你破解...
    沈念sama閱讀 222,946評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件展融,死亡現(xiàn)場離奇詭異,居然都是意外死亡豫柬,警方通過查閱死者的電腦和手機告希,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,336評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來烧给,“玉大人燕偶,你說我怎么就攤上這事〈〉眨” “怎么了指么?”我有些...
    開封第一講書人閱讀 169,716評論 0 364
  • 文/不壞的土叔 我叫張陵,是天一觀的道長驰吓。 經(jīng)常有香客問我涧尿,道長,這世上最難降的妖魔是什么檬贰? 我笑而不...
    開封第一講書人閱讀 60,222評論 1 300
  • 正文 為了忘掉前任姑廉,我火速辦了婚禮,結果婚禮上翁涤,老公的妹妹穿的比我還像新娘桥言。我一直安慰自己,他們只是感情好葵礼,可當我...
    茶點故事閱讀 69,223評論 6 398
  • 文/花漫 我一把揭開白布号阿。 她就那樣靜靜地躺著,像睡著了一般鸳粉。 火紅的嫁衣襯著肌膚如雪扔涧。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,807評論 1 314
  • 那天届谈,我揣著相機與錄音枯夜,去河邊找鬼。 笑死艰山,一個胖子當著我的面吹牛湖雹,可吹牛的內容都是我干的。 我是一名探鬼主播曙搬,決...
    沈念sama閱讀 41,235評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼摔吏,長吁一口氣:“原來是場噩夢啊……” “哼鸽嫂!你這毒婦竟也來了?” 一聲冷哼從身側響起征讲,我...
    開封第一講書人閱讀 40,189評論 0 277
  • 序言:老撾萬榮一對情侶失蹤据某,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后稳诚,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體哗脖,經(jīng)...
    沈念sama閱讀 46,712評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡瀑踢,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,775評論 3 343
  • 正文 我和宋清朗相戀三年扳还,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片橱夭。...
    茶點故事閱讀 40,926評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡氨距,死狀恐怖,靈堂內的尸體忽然破棺而出棘劣,到底是詐尸還是另有隱情俏让,我是刑警寧澤,帶...
    沈念sama閱讀 36,580評論 5 351
  • 正文 年R本政府宣布茬暇,位于F島的核電站首昔,受9級特大地震影響,放射性物質發(fā)生泄漏糙俗。R本人自食惡果不足惜勒奇,卻給世界環(huán)境...
    茶點故事閱讀 42,259評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望巧骚。 院中可真熱鬧赊颠,春花似錦、人聲如沸劈彪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,750評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽沧奴。三九已至痘括,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間滔吠,已是汗流浹背纲菌。 一陣腳步聲響...
    開封第一講書人閱讀 33,867評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留屠凶,地道東北人驰后。 一個月前我還...
    沈念sama閱讀 49,368評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像矗愧,于是被迫代替她去往敵國和親灶芝。 傳聞我的和親對象是個殘疾皇子郑原,可洞房花燭夜當晚...
    茶點故事閱讀 45,930評論 2 361

推薦閱讀更多精彩內容

  • 概述 JavaScript提供了一個內部數(shù)據(jù)結構,用來描述一個對象的屬性的行為夜涕,控制它的行為犯犁。這被稱為“屬性描述對...
    zjh111閱讀 729評論 0 0
  • 官方中文版原文鏈接 感謝社區(qū)中各位的大力支持,譯者再次奉上一點點福利:阿里云產(chǎn)品券女器,享受所有官網(wǎng)優(yōu)惠酸役,并抽取幸運大...
    HetfieldJoe閱讀 2,597評論 9 22
  • 特別說明,為便于查閱驾胆,文章轉自https://github.com/getify/You-Dont-Know-JS...
    殺破狼real閱讀 673評論 0 1
  • 盡管javascript里有大量內建引用對象涣澡,很可能你還說會頻繁創(chuàng)建自己的對象。當你在這么做的時候丧诺,記得javas...
    WanLum閱讀 534評論 1 3
  • 如果怒火可以自燃我已燒成灰燼 如果悲傷可以化水我已化成河流
    深北羽翼閱讀 163評論 13 5