每一個對象都有與之相關(guān)的原型、類、可擴展性。這就是對象的三個屬性
原型屬性
對象的原型屬性是是用來繼承屬性的。
類屬性
對象的類屬性是用來表示對象的類型信息的。
如何獲得對象的類??
- 可以通過調(diào)用 toString() 方法,會返回這樣格式的字符串 [object class]
- 接著提取字符串的第8個到倒數(shù)第二個位置之間的字符。
名稱
通過內(nèi)置構(gòu)造函數(shù)創(chuàng)建的對象,其類屬性與構(gòu)造函數(shù)的名稱相匹配。
宿主對象也有包含其意義的類屬性
通過對象直接量和Object.create創(chuàng)建的對象的類屬性是“Object”
-
自定義構(gòu)造函數(shù)創(chuàng)建的對象的類屬性也是"Object",因此,對于自定義的類來說,沒辦法通過類屬性來區(qū)分對象的類。但是,可以通過構(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
可擴展性
對象的可擴展性用來表示是否可以給對象添加新屬性
這里涉及到JS對象中有兩種屬性:數(shù)據(jù)屬性和存取器屬性
- 對象的數(shù)據(jù)屬性的特性包括:value(值), writable(可寫性), enumerable (可枚舉性), configurable(可配置性)一般來說,在新建一個對象屬性時,默認(rèn)情況下的性質(zhì)都是true的。
- 對象的存取器屬性包括: get(讀取), set(寫入),enumerable(可枚舉性),configurable(可配置性)
屬性不可配置的話就說明,不可以修改其屬性的可配置性和可枚舉性
- 當(dāng)數(shù)據(jù)屬性是不可配置的時候,就不能將它的可寫性從false改為true, 但可以從true轉(zhuǎn)為false(可以變壞不可以變好)
- 當(dāng)存取器屬性是不可配置的時候,不能修改其getter和setter方法
所有的內(nèi)置對象和自定義對象都是顯示可擴展的,然后如何來設(shè)置改變這些特性呢??
- Object.preventExtensions() 將對象設(shè)置為不可擴展,這個時候可以設(shè)置屬性的相關(guān)值,但是不可以添加新的屬性。
- Object.seal() 將對象對象設(shè)置為不可擴展,同時設(shè)置對象的自有屬性為不可配置。
- Object.freeze()將對象設(shè)置為不可擴展性,屬性不可配置,并且數(shù)據(jù)屬性為只讀(writable為false),但是如果對象的存取器屬性具有setter方法,存取器屬性將不受影響,仍可以通過屬性賦值調(diào)用他們。
序列化對象
對象序列化是指將對象的狀態(tài)轉(zhuǎn)為字符串,即JSON.stringify()。也可以將字符串還原為對象 JSON.parse()
轉(zhuǎn)為字符串的話我們還會想到另一個方法,toString(), 這個方法將返回一個表示調(diào)用這個方法的對象值的字符串
NaN, Infinity, -Infinity序列化的結(jié)果是null,
日期對象序列化后的結(jié)果是字符串,但JSON.parse()仍會保留他們的字符串狀態(tài)
函數(shù)、RegExp、Error對象和undefined值不能序列化和還原
-
JSON.stringify()只能序列化對象可枚舉的自有屬性,對于一個不能序列化的屬性來說,在序列化后輸出的結(jié)果會將這個屬性省略掉
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));

image.png