對(duì)象
創(chuàng)建對(duì)象的方式
- 對(duì)象直接量: var o = {x:1, y:2, f: function(){...}}
- new關(guān)鍵字:new Date(), new Array()
- Object.create()方法:
var o1 = Object.create({x:1,y:2});// o1集成了屬性x和y
子檀; 還可以傳入null來創(chuàng)建一個(gè)沒有原型的對(duì)象镊掖,var o2 = Object.create(null);// o2不集成了任何屬性和方法
;如果想創(chuàng)建一個(gè)空對(duì)象var o3 = Object.create(Object.prototype);// o3相當(dāng)于{}和new Object()是一個(gè)空對(duì)象
褂痰。
屬性的刪除
delete運(yùn)算符可以刪除對(duì)象的屬性亩进,但它只是斷開屬性與宿主對(duì)象的聯(lián)系,而不會(huì)主動(dòng)去操作屬性中的屬性缩歪。同時(shí)归薛,只能刪除自有屬性,不能刪除繼承屬性。舉例:
a = {p:{x:1}}; b=a.p; delete a.p;
執(zhí)行后主籍,b.x的值依然是1 习贫。
檢測(cè)屬性
JavaScript的對(duì)象可以看做是屬性的集合,判斷某個(gè)屬性是否存在于某個(gè)對(duì)象中千元,可以通過in運(yùn)算符苫昌、hasOwnProperty()和propertyIsEnumerable()來檢測(cè),甚至可以通過屬性查詢來實(shí)現(xiàn)幸海。
!==
可以區(qū)分null 和 undefined
;所以有時(shí)不便于區(qū)分var o = {x:undefined}
物独,這時(shí)o.x !== undefined
返回false袜硫,然而x是o的屬性。
枚舉屬性
可以使用for/in循環(huán)來枚舉挡篓,這個(gè)可以遍歷對(duì)象的自有屬性和繼承屬性婉陷,把屬性名稱賦值給循環(huán)的變量。對(duì)象繼承的內(nèi)置方法不能遍歷官研,但在代碼中對(duì)象添加的屬性是可以枚舉的秽澳。
目前有許多工具可對(duì)Object.prototype進(jìn)行了擴(kuò)展,添加了許多屬性方法阀参,而這些屬性方法是能夠被繼承下來的肝集,在ES5之前這些新添加的方法不可以被定義為不可枚舉,所以回被for/in循環(huán)遍歷出來蛛壳,因此常添加過濾杏瞻,有兩種常見的方式:
屬性getter和setter
對(duì)象的屬性由名字,值和一組特性組成衙荐。在ES5中屬性值可以由兩個(gè)方法代替:getter和setter捞挥,這樣的屬性叫做“存取器屬性”(accessor property),它不同于“數(shù)據(jù)屬性”(data property)忧吟,數(shù)據(jù)屬性只有一個(gè)值砌函。
舉例:
和數(shù)據(jù)屬性一樣,存取器屬性也是可以繼承的:
屬性的特性
我們可以認(rèn)為屬性包含一個(gè)名字和4個(gè)特性溜族。
- 數(shù)據(jù)屬性4個(gè)特性:它的值value讹俊、可寫性writtable、可枚舉性enumerable和可配置性configurable煌抒。
- 存取器屬性4個(gè)特性:讀取get仍劈、寫入set、可枚舉性enumerable和可配置性configurable寡壮。
要想設(shè)置屬性的特性贩疙,或者想讓新建屬性具有某些特性讹弯,則需要調(diào)用Object.defineProperty(),傳入要修改的對(duì)象,要?jiǎng)?chuàng)建或修改的屬性的名稱和屬性描述符對(duì)象:
這里面的規(guī)則比較多这溅,違反的話會(huì)拋出類型錯(cuò)誤異常组民。
對(duì)象的三個(gè)屬性
-
原型屬性prototype,用來實(shí)現(xiàn)繼承悲靴,是在實(shí)例被創(chuàng)建之初就設(shè)置好了的臭胜。在ES5中可以通過isPrototypeOf()來查詢對(duì)象的原型
-
類屬性:是一個(gè)字符串,用來表示對(duì)象的類型信息对竣。常通過toString()方法來獲取庇楞,不過要封裝一下比較安全
注意,那些通過自定義構(gòu)造函數(shù)創(chuàng)建的對(duì)象和通過直接量創(chuàng)建的對(duì)象否纬,類屬性均為“Object”。
- 對(duì)象的可擴(kuò)展性:用以表示是否可以給對(duì)象添加新的屬性蛋褥。所有內(nèi)置對(duì)象和自定義對(duì)象都是可以顯示擴(kuò)展的临燃,宿主對(duì)象的可擴(kuò)展性擇優(yōu)JavaScript引擎決定。
- Object.esExtensible():判斷對(duì)象是否可擴(kuò)展烙心。
- Object.preventExtensions():將對(duì)象轉(zhuǎn)換為不可擴(kuò)展膜廊,一旦轉(zhuǎn)換將不可逆,及無法再轉(zhuǎn)換為可擴(kuò)展了淫茵。這個(gè)方法只影響對(duì)象本身爪瓜,在對(duì)它的原型添加新屬性時(shí),它也可以繼承獲取這個(gè)新添加的屬性匙瘪。
- Object.steal():除了將對(duì)象設(shè)置為不可擴(kuò)展铆铆,還能將對(duì)象所有自有屬性設(shè)置為不可配置。
- Object.freeze()
序列化對(duì)象
指講對(duì)象轉(zhuǎn)換為字符串丹喻,也可以將字符串還原為對(duì)象薄货。