每一個(gè)對(duì)象都有與之相關(guān)的原型也殖、類窍蓝、可擴(kuò)展性腋颠。這就是對(duì)象的三個(gè)屬性
原型屬性
對(duì)象的原型屬性是是用來繼承屬性的。
類屬性
對(duì)象的類屬性是用來表示對(duì)象的類型信息的吓笙。
如何獲得對(duì)象的類淑玫??
- 可以通過調(diào)用 toString() 方法面睛,會(huì)返回這樣格式的字符串 [object class]
- 接著提取字符串的第8個(gè)到倒數(shù)第二個(gè)位置之間的字符絮蒿。
名稱
通過內(nèi)置構(gòu)造函數(shù)創(chuàng)建的對(duì)象,其類屬性與構(gòu)造函數(shù)的名稱相匹配叁鉴。
宿主對(duì)象也有包含其意義的類屬性
通過對(duì)象直接量和Object.create創(chuàng)建的對(duì)象的類屬性是“Object”
-
自定義構(gòu)造函數(shù)創(chuàng)建的對(duì)象的類屬性也是"Object"土涝,因此,對(duì)于自定義的類來說幌墓,沒辦法通過類屬性來區(qū)分對(duì)象的類但壮。但是冀泻,可以通過構(gòu)造器的名稱來區(qū)分。
function classof(o) { if(o === null)return "NULL"; if(o === undefined) return "Undefined"; return Object.prototype.toString.call(o).slice(8, -1); } console.log(classof(1)); //Number console.log(classof("")); //String console.log(classof({})); //Object console.log(classof([])); //Array console.log(classof(new Date())); //Date console.log(classof(window)); //window console.log(classof(document)); //HTMLDocument function f() {} console.log(classof(new f())); //Object 構(gòu)造器名稱的獲取方法:a.constructor.name
可擴(kuò)展性
對(duì)象的可擴(kuò)展性用來表示是否可以給對(duì)象添加新屬性
這里涉及到JS對(duì)象中有兩種屬性:數(shù)據(jù)屬性和存取器屬性
- 對(duì)象的數(shù)據(jù)屬性的特性包括:value(值), writable(可寫性), enumerable (可枚舉性), configurable(可配置性)一般來說茵肃,在新建一個(gè)對(duì)象屬性時(shí)腔长,默認(rèn)情況下的性質(zhì)都是true的。
- 對(duì)象的存取器屬性包括: get(讀取)验残, set(寫入)捞附,enumerable(可枚舉性),configurable(可配置性)
屬性不可配置的話就說明您没,不可以修改其屬性的可配置性和可枚舉性
- 當(dāng)數(shù)據(jù)屬性是不可配置的時(shí)候鸟召,就不能將它的可寫性從false改為true, 但可以從true轉(zhuǎn)為false(可以變壞不可以變好)
- 當(dāng)存取器屬性是不可配置的時(shí)候,不能修改其getter和setter方法
所有的內(nèi)置對(duì)象和自定義對(duì)象都是顯示可擴(kuò)展的氨鹏,然后如何來設(shè)置改變這些特性呢欧募??
- Object.preventExtensions() 將對(duì)象設(shè)置為不可擴(kuò)展仆抵,這個(gè)時(shí)候可以設(shè)置屬性的相關(guān)值跟继,但是不可以添加新的屬性。
- Object.seal() 將對(duì)象對(duì)象設(shè)置為不可擴(kuò)展镣丑,同時(shí)設(shè)置對(duì)象的自有屬性為不可配置舔糖。
- Object.freeze()將對(duì)象設(shè)置為不可擴(kuò)展性,屬性不可配置莺匠,并且數(shù)據(jù)屬性為只讀(writable為false)金吗,但是如果對(duì)象的存取器屬性具有setter方法,存取器屬性將不受影響趣竣,仍可以通過屬性賦值調(diào)用他們摇庙。
序列化對(duì)象
對(duì)象序列化是指將對(duì)象的狀態(tài)轉(zhuǎn)為字符串,即JSON.stringify()遥缕。也可以將字符串還原為對(duì)象 JSON.parse()
轉(zhuǎn)為字符串的話我們還會(huì)想到另一個(gè)方法卫袒,toString(), 這個(gè)方法將返回一個(gè)表示調(diào)用這個(gè)方法的對(duì)象值的字符串
NaN, Infinity, -Infinity序列化的結(jié)果是null,
日期對(duì)象序列化后的結(jié)果是字符串通砍,但JSON.parse()仍會(huì)保留他們的字符串狀態(tài)
函數(shù)玛臂、RegExp、Error對(duì)象和undefined值不能序列化和還原
-
JSON.stringify()只能序列化對(duì)象可枚舉的自有屬性封孙,對(duì)于一個(gè)不能序列化的屬性來說,在序列化后輸出的結(jié)果會(huì)將這個(gè)屬性省略掉
var b = new Date(); var a =JSON.stringify(b); console.log('JSON.stringify: ' + a); console.log('toString: ' + a); console.log('typeof(JSON.parse(a)): ' + typeof(JSON.parse(a))); console.log('typeof(new Date()): ' + typeof(b));