對(duì)象可以通過(guò)兩種形式定義:聲明(文字)形式和構(gòu)造形式。
var myObj = { 文字形式超燃。
key: value
// ...
};
var myObj = new Object(); 構(gòu)造形式妹窖。
myObj.key = value;
構(gòu)造形式和文字形式生成的對(duì)象是一樣的。唯一的區(qū)別是,在文字聲明中你可以添加多個(gè)鍵 / 值對(duì)凑术,但是在構(gòu)造形式中你必須逐個(gè)添加屬性。
內(nèi)容
var myObject = {
a: 2
};
myObject.a; // 2? 屬性訪(fǎng)問(wèn)
myObject["a"]; // 2 ?鍵訪(fǎng)問(wèn)
這兩種語(yǔ)法的主要區(qū)別在于 . 操作符要求屬性名滿(mǎn)足標(biāo)識(shí)符的命名規(guī)范所意,而 [".."] 語(yǔ)法可以接受任意 UTF-8/Unicode 字符串作為屬性名淮逊。舉例來(lái)說(shuō),如果要引用名稱(chēng)為 "SuperFun!"的屬性扶踊,那就必須使用 ["Super-Fun!"] 語(yǔ)法訪(fǎng)問(wèn)泄鹏,因?yàn)?Super-Fun! 并不是一個(gè)有效的標(biāo)識(shí)符屬性名。
對(duì)象中屬性永遠(yuǎn)是字符串 ?字面量 秧耗。NUMBER OBJECT都不例外备籽。會(huì)給轉(zhuǎn)為STRING。數(shù)組是數(shù)字分井。區(qū)分對(duì)象和數(shù)組车猬。
可計(jì)算屬性名
? ?健訪(fǎng)問(wèn)派上用場(chǎng)了霉猛!
? ?ES6 增加了可計(jì)算屬性名,可以在文字形式中使用 [] 包裹一個(gè)表達(dá)式來(lái)當(dāng)作屬性名:
? ?例如:
var prefix = "foo";
var myObject = {
[prefix + "bar"]:"hello",
[prefix + "baz"]: "world"
};
myObject["foobar"]; // hello
myObject["foobaz"]; // world
屬性與方法
? ? ? ?屬性是個(gè)函數(shù)珠闰,開(kāi)發(fā)者喜歡叫為方法惜浅。
數(shù)組
復(fù)制對(duì)象
屬性描述符
var myObject = {
a:2
};
Object.getOwnPropertyDescriptor( myObject, "a" );
// {
// value: 2,
// writable: true,
// enumerable: true,
// configurable: true
// }
writable(可寫(xiě))、enumerable(可枚舉)和 configurable(可配置)伏嗜。
? 1. Writable
? ?writable 決定是否可以修改屬性的值坛悉。
? ?writable: false, // 不可寫(xiě)! 對(duì)對(duì)象的屬性修改就無(wú)效阅仔。
? 2. Configurable
? 只要屬性是可配置的吹散,就可以使用 defineProperty(..) 方法來(lái)修改屬性描述符:
? configurable:false
? 把 writable 的狀態(tài)由 true 改為 false,但是無(wú)法由 false 改為 true八酒。
? 除了無(wú)法修改空民,configurable:false 還會(huì)禁止刪除這個(gè)屬性:
? 3. Enumerable
? 從名字就可以看出,這個(gè)描述符控制的是屬性是否會(huì)出現(xiàn)在對(duì)象的屬性枚舉中羞迷,比如說(shuō)
? for..in 循環(huán)界轩。如果把 enumerable 設(shè)置成 false,這個(gè)屬性就不會(huì)出現(xiàn)在枚舉中衔瓮,雖然仍
? 然可以正常訪(fǎng)問(wèn)它浊猾。相對(duì)地,設(shè)置成 true 就會(huì)讓它出現(xiàn)在枚舉中热鞍。
? ?用戶(hù)定義的所有的普通屬性默認(rèn)都是 enumerable葫慎,這通常就是你想要的。但是如果你不希
? ?望某些特殊屬性出現(xiàn)在枚舉中薇宠,那就把它設(shè)置成 enumerable:false偷办。
? 對(duì)象常量
? 結(jié)合 writable:false 和 configurable:false 就可以創(chuàng)建一個(gè)真正的常量屬性(不可修改、重定義或者刪除):
? 禁止擴(kuò)展
? Object.preventExtensions(..)
? 密封
?Object.seal(..) 會(huì)創(chuàng)建一個(gè)“密封”的對(duì)象澄港,這個(gè)方法實(shí)際上會(huì)在一個(gè)現(xiàn)有對(duì)象上調(diào)用
?Object.preventExtensions(..) 并把所有現(xiàn)有屬性標(biāo)記為 configurable:false椒涯。
?所以,密封之后不僅不能添加新屬性回梧,也不能重新配置或者刪除任何現(xiàn)有屬性(雖然可以
?修改屬性的值)废岂。
? ?凍結(jié)
? Object.freeze(..) 會(huì)創(chuàng)建一個(gè)凍結(jié)對(duì)象,這個(gè)方法實(shí)際上會(huì)在一個(gè)現(xiàn)有對(duì)象上調(diào)用Object.seal(..) 并把所有“數(shù)據(jù)訪(fǎng)問(wèn)”屬性標(biāo)記為 writable:false狱意, ? ? 這樣就無(wú)法修改它們的值湖苞。