理解JavaScript對象
對象是JavaScript的基本數據類型。對象是一種復合值:將很多值(原始值或者其他對象)聚合在一起。
JavaScript對象不僅可以保持自有的屬性,還可以從原型對象繼承屬性。對象的方法通常是繼承的屬性。原型式繼承是JavaScript的核心特征。
JavaScript對象是動態的——可以新增屬性也可以刪除屬性,除了字符串,數字,true,false,null和undefined之外(當使用他們的屬性方法時,會隱式的變成包裝對象),JavaScript中的值都是對象。
對象是可變的,我們通過引用而非值來操作對象,如果變量x是指向一個對象的引用,那么執行代碼var y=x;變量y也是指向同一個對象的引用,而非這個對象的副本,通過變量y修改這個對象亦會對變量x造成影響。
JavaScript規定,如果行首是大括號,一律解釋為語句(即代碼塊)。如果要解釋為表達式(即對象),必須在大括號前加上圓括號。
對象的最常見的用法是:
創建(create),設置(set),查找(query),刪除(delete),檢測(test),枚舉(enumerate)它的屬性。
1.對象創建:
對象的生成方法,通常有三種方法。除了像上面那樣直接使用大括號生成({}),還可以用new命令生成一個Object對象的實例,或者使用Object.create方法生成。
第一種:對象直接量
var point={x:0,y:0;}
第二種:通過new后面加上構造函數創建對象
var o=new Object();
第三種:通過Object.create方法生成
var o=Object.create(null);//這個方法可以傳入原型對象
總結:一般來說,第一種采用大括號的寫法比較簡潔,第二種采用構造函數的寫法清晰地表示了意圖,第三種寫法一般用在需要對象繼承的場合。
2.對象屬性的設置與查詢
查詢
o.x或者o["x"]
設置
o.x=2或者o["x"]=2
3.屬性的刪除
delete o.x
delete只能刪除自由屬性,不能刪除繼承屬性
4.屬性的檢測
javascript對象可以看作屬性的集合,我們經常會檢測集合中成員的所屬關系,判斷某個屬性是否存在於某個對象中。
(1)in運算符
運算符左側是屬性名,右側是對象。如果對象的自有屬性或繼承屬性中包含這個屬性則返回true。
"x" in o
(2)hasOwnProperty()
用於檢測給定的名字是否是對象的自有屬性。對於繼承屬性它將返回false。
o.hasOwnProperty("x")
(3)propertyIsEnumerable()
propertyIsEnumerable()是hasOwnProperty()的加強版,只有檢測到是自有屬性且這個屬性的可枚舉性為true時它才返回true
o.propertyIsEnumerable("x")
5.屬性枚舉
通過使用for/in循環可以在循環體中遍歷對象中所有可枚舉的屬性(包括自由屬性和繼承的屬性)。對象繼承的內置方法不可枚舉,但是代碼中給對象添加的屬性都是可枚舉的。
示例:遍歷對象的所有可枚舉屬性
for(property in o){
}
示例:遍歷對象的自有屬性
for(property in o){
if(!o.hasOwnProperty(property)) continue; //跳過繼承的屬性
console.log(property);//輸出自有屬性
}
示例:跳過方法
for(property in o){
if(typeof o[property] === "function") continue; //跳過方法
}