對象

對象可以通過兩種形式定義:聲明(文字)形式和構(gòu)造形式。

var myObj = { 文字形式。

key: value

// ...

};

var myObj = new Object(); 構(gòu)造形式。

myObj.key = value;

構(gòu)造形式和文字形式生成的對象是一樣的。唯一的區(qū)別是,在文字聲明中你可以添加多個鍵 / 值對,但是在構(gòu)造形式中你必須逐個添加屬性。

內(nèi)容

var myObject = {

a: 2

};

myObject.a; // 2? 屬性訪問

myObject["a"]; // 2 ?鍵訪問

這兩種語法的主要區(qū)別在于 . 操作符要求屬性名滿足標(biāo)識符的命名規(guī)范,而 [".."] 語法可以接受任意 UTF-8/Unicode 字符串作為屬性名。舉例來說,如果要引用名稱為 "SuperFun!"的屬性,那就必須使用 ["Super-Fun!"] 語法訪問,因為 Super-Fun! 并不是一個有效的標(biāo)識符屬性名。

對象中屬性永遠(yuǎn)是字符串 ?字面量 。NUMBER OBJECT都不例外。會給轉(zhuǎn)為STRING。數(shù)組是數(shù)字。區(qū)分對象和數(shù)組。

可計算屬性名

? ?健訪問派上用場了!

? ?ES6 增加了可計算屬性名,可以在文字形式中使用 [] 包裹一個表達(dá)式來當(dāng)作屬性名:

? ?例如:

var prefix = "foo";

var myObject = {

[prefix + "bar"]:"hello",

[prefix + "baz"]: "world"

};

myObject["foobar"]; // hello

myObject["foobaz"]; // world

屬性與方法

? ? ? ?屬性是個函數(shù),開發(fā)者喜歡叫為方法。

數(shù)組

復(fù)制對象


屬性描述符

var myObject = {

a:2

};

Object.getOwnPropertyDescriptor( myObject, "a" );

// {

// value: 2,

// writable: true,

// enumerable: true,

// configurable: true

// }

writable(可寫)、enumerable(可枚舉)和 configurable(可配置)。

? 1. Writable

? ?writable 決定是否可以修改屬性的值。

? ?writable: false, // 不可寫! 對對象的屬性修改就無效。

? 2. Configurable

? 只要屬性是可配置的,就可以使用 defineProperty(..) 方法來修改屬性描述符:

? configurable:false

? 把 writable 的狀態(tài)由 true 改為 false,但是無法由 false 改為 true。

? 除了無法修改,configurable:false 還會禁止刪除這個屬性:

? 3. Enumerable

? 從名字就可以看出,這個描述符控制的是屬性是否會出現(xiàn)在對象的屬性枚舉中,比如說

? for..in 循環(huán)。如果把 enumerable 設(shè)置成 false,這個屬性就不會出現(xiàn)在枚舉中,雖然仍

? 然可以正常訪問它。相對地,設(shè)置成 true 就會讓它出現(xiàn)在枚舉中。

? ?用戶定義的所有的普通屬性默認(rèn)都是 enumerable,這通常就是你想要的。但是如果你不希

? ?望某些特殊屬性出現(xiàn)在枚舉中,那就把它設(shè)置成 enumerable:false。

? 對象常量

? 結(jié)合 writable:false 和 configurable:false 就可以創(chuàng)建一個真正的常量屬性(不可修改、重定義或者刪除):

? 禁止擴(kuò)展

? Object.preventExtensions(..)

? 密封

?Object.seal(..) 會創(chuàng)建一個“密封”的對象,這個方法實際上會在一個現(xiàn)有對象上調(diào)用

?Object.preventExtensions(..) 并把所有現(xiàn)有屬性標(biāo)記為 configurable:false。

?所以,密封之后不僅不能添加新屬性,也不能重新配置或者刪除任何現(xiàn)有屬性(雖然可以

?修改屬性的值)。

? ?凍結(jié)

? Object.freeze(..) 會創(chuàng)建一個凍結(jié)對象,這個方法實際上會在一個現(xiàn)有對象上調(diào)用Object.seal(..) 并把所有“數(shù)據(jù)訪問”屬性標(biāo)記為 writable:false, ? ? 這樣就無法修改它們的值。

?Getter和Setter

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 官方中文版原文鏈接 感謝社區(qū)中各位的大力支持,譯者再次奉上一點點福利:阿里云產(chǎn)品券,享受所有官網(wǎng)優(yōu)惠,并抽取幸運大...
    HetfieldJoe閱讀 2,678評論 9 22
  • 特別說明,為便于查閱,文章轉(zhuǎn)自https://github.com/getify/You-Dont-Know-JS...
    殺破狼real閱讀 723評論 0 1
  • 對象 對象可以通過兩種形式定義: 聲明形式和構(gòu)造形式 聲明形式語法: var myObj = {key:value...
    qhaobaba閱讀 373評論 0 0
  • 概述 JavaScript提供了一個內(nèi)部數(shù)據(jù)結(jié)構(gòu),用來描述一個對象的屬性的行為,控制它的行為。這被稱為“屬性描述對...
    zjh111閱讀 785評論 0 0
  • 盡管javascript里有大量內(nèi)建引用對象,很可能你還說會頻繁創(chuàng)建自己的對象。當(dāng)你在這么做的時候,記得javas...
    WanLum閱讀 599評論 1 3

友情鏈接更多精彩內(nèi)容