1)創(chuàng)建對(duì)象:字面量和構(gòu)造函數(shù)
var?obj?=?{}; //字面量
var?obj?=?new?Object(); //構(gòu)造函數(shù)
2)屬性操作
對(duì)象里的屬性有如下特性:
數(shù)據(jù)屬性:
configurable:設(shè)置屬性是否能被刪除,屬性的特性是否能被設(shè)置,能否修改屬性的值等;
enumerable:設(shè)置屬性是否可枚舉
writable:設(shè)置屬性的值能否被修改
value:設(shè)置屬性的值
在添加一個(gè)對(duì)象的屬性時(shí)默認(rèn)上面的特性都為true,而value則是屬性的值,如果想通過(guò)自定義這些特性來(lái)設(shè)置對(duì)象屬性,可以通過(guò)Object.defineProperty,如下:
var?person?=?{name:"張三"};
Object.defineProperty(person,name,{configurable:true,enumerable:true,writable:true,value:"李四”});
在上面所設(shè)置的特性當(dāng)中,configurable如果為false表示屬性特性設(shè)置在之后不能被改動(dòng)(除了writable,writable在configurable為false時(shí)仍然可以設(shè)置成false),而且configurable一旦為false后就不能再設(shè)置成true了,
而enumberable如果為false則表示該屬性不可枚舉,用for?in循環(huán)輸出對(duì)象屬性時(shí)該屬性不會(huì)被輸出;
writable很明顯,為false時(shí)則表示不可修改該屬性的值(不過(guò)當(dāng)configurable為true時(shí)可以通過(guò)修改value的值直接改寫或者將writable修改為true)
Object.defineProperty(person,name,{configurable:false});
delete?person.name; //delete操作不成功
Object.defineProperty(person,name,{enumerable:false}); //操作不成功
...
訪問(wèn)器屬性
configurable:設(shè)置屬性是否能被刪除,屬性的特性是否能被設(shè)置,能否修改屬性的值等;
enumerable:設(shè)置屬性是否可枚舉
get?/?set?:在讀寫屬性時(shí)會(huì)自動(dòng)調(diào)用的函數(shù)
比如:
var?book?=?{
???_year:2004,
???edition:1
};
Object.defineProperty(book,"year",{
???get:function(){
????????return?this._year;
???},
???set:function(newValue){
???????this._year?=?newValue;
???????this.edition?+=?newValue?-?2004;
???}
});
book.year?=?2005; //當(dāng)要設(shè)置year屬性時(shí),會(huì)自動(dòng)調(diào)用set方法
alert(book.edition);
如果要的不止是配置單單一個(gè)屬性,而是要同時(shí)配置多個(gè),可以通過(guò)Object.defineProperties,如下:
var?person?=?{name:"張三"};
Object.defineProperty(person,{
??????name:{value:"李四”,configurable:false},
??????sex:{value:"man",writable:false}
});
在配置完屬性后或者通過(guò)Object.defineProperty更改過(guò)屬性后想讀者該屬性,可以通過(guò)Object.getOwnPropertyDescriptor讀取
Object.getOwnPropertyDescriptor(book,"edition"); //讀取book對(duì)象中的edition屬性
3)對(duì)象標(biāo)簽
[[proto]]:
對(duì)象中有個(gè)屬性[[proto]]指向它的構(gòu)造器的原型
[[class]]:
看不懂視頻里在講啥-?-,沒(méi)說(shuō)為啥是通過(guò)Object.prototype.toString去獲取[[class]]的,所以還是不懂[[class]]的含義
[[extensible]]:
var?obj?=?{x:1,y:2};
Object.isExtensible(obj); //檢測(cè)對(duì)象是否可擴(kuò)展,一般來(lái)說(shuō)默認(rèn)都是true
Object.preventExtensions(obj); //禁止對(duì)象可擴(kuò)展
Object.defineProperty(obj,"x",{value:2}); //雖然禁止了對(duì)象擴(kuò)展,但是刪除或者修改屬性的值以及標(biāo)簽
Object.seal(obj); //禁止對(duì)象屬性被刪除以及配置屬性標(biāo)簽
Object.isSealed(obj); //判斷對(duì)象是否被seal
Object.freeze(obj); //凍結(jié)對(duì)象,禁止對(duì)象屬性值被改寫
Object.isFrozen(obj); //判斷對(duì)象是否被freeze
4)序列化
在向后臺(tái)發(fā)送請(qǐng)求數(shù)據(jù)時(shí),用JSON.stringify將對(duì)象轉(zhuǎn)化為字符串,用JSON.parse將字符串解析為對(duì)象
但是,在用JSON.stringify將對(duì)象轉(zhuǎn)化為字符串時(shí)如果對(duì)象屬性的值為undefined,那么它將不會(huì)出現(xiàn)在轉(zhuǎn)化后的字符串里
如果我們想自定義序列化,可以在對(duì)象里自定義toJSON方法,同理,我們?cè)趯?duì)象toString或者valueOf時(shí)也可以自定義toString方法和valueOf方法
對(duì)象轉(zhuǎn)化為基本類型的過(guò)程:
在后臺(tái)首先會(huì)自動(dòng)調(diào)用valueOf方法嘗試將對(duì)象轉(zhuǎn)化為基本類型,如果valueOf不存在或者無(wú)法轉(zhuǎn)化為基本類型則會(huì)調(diào)用toString方法繼續(xù)嘗試,如果兩種都無(wú)法將對(duì)象轉(zhuǎn)化為基本類型則會(huì)報(bào)錯(cuò)
2016-09-09
看不懂,就要多學(xué)習(xí),沒(méi)有人一下就能看懂的,看不懂就從最基礎(chǔ)開始學(xué)習(xí)