對象可以通過兩種形式定義:聲明(文字)形式和構(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, ? ? 這樣就無法修改它們的值。