#第6章 對象
- <a href="#no1">6.1 創建對象</a>
- <a href="#no2">6.2 屬性的查詢和設置</a>
- <a href="#no3">6.3 刪除屬性</a>
- <a href="#no4">6.4 檢測屬性</a>
- <a href="#no5">6.5 枚舉屬性</a>
- <a href="#no6">6.6 屬性`getter`和`setter`</a>
- <a href="#no7">6.7 屬性的特性</a>
- <a href="#no8">6.8 對象的三個屬性</a>
- <a href="#no9">6.9 序列化對象</a>
- <a href="#no10">6.10 對象方法</a>
> 除了字符串、數字、`true`、`false`、`null`和`undefined`之外,JS中的值都是對象。
**對象最常見的用法是創建(`create`)、設置(`set`)、查找(`query`)、刪除(`delete`)、檢測(`test`)和枚舉(`enumerate`)它的屬性。**
> 屬性包括名字和值
> 1. 屬性名可以包含空字符串在內的任意字符串,但對象中不能存在兩個同名的屬性。2. 值可以是任意JS值,或者可以是一個`getter`或`setter`函數。
- 內置對象(native object)是由ECMAScript規范定義的對象或類。例如:數組、函數、日期和正則表達式都是內置對象。
- 宿主對象(host object)是由JS解釋器所嵌入的宿主環境定義的。客戶端JS中表示網頁結構的HTMLElement對象均是宿主對象。既然宿主環境定義的方法可以當成普通的JS函數對象,那么宿主對象也可以當成內置對象。
- 自定義對象(user-defined object)是由運行中的JS代碼創建的對象。
- 自有屬性(own property)是直接在對象中定義的屬性。
- 繼承屬性(inherited property)是在對象的原型對象中定義的屬性。
##<a name="no1">6.1 創建對象</a>
> 可以通過對象直接量、關鍵字`new`和`Object.create()`函數來創建對象。
###6.1.1 對象直接量
> 對象直接量是由若干名/值對組成的映射表,名/值對中間用冒號分隔,整改映射表用花括號括起來。
###6.1.2 通過new創建對象
> `new`運算符創建并初始化一個新對象。關鍵字`new`后跟隨一個函數調用。這里的函數稱作構造函數,構造函數用以初始化一個新創建的對象。
###6.1.3 原型
> 每一個JS對象(null除外)都從原型繼承屬性。
###6.1.4 Object create()
> 略
##<a name="no2">6.2 屬性的查詢和設置</a>
> 可以通過`.`或方括號`[]`運算符來獲取屬性的值。
###6.2.1 作為關聯數組的對象
> 略
###6.2.2 繼承
> 略
###6.2.3 屬性訪問錯誤
> 略
##<a name="no3">6.3 刪除屬性</a>
> `delete`運算符可以刪除對象的屬性。**`delete`只能刪除自有屬性,不能刪除繼承屬性。**
##<a name="no4">6.4 檢測屬性</a>
> 可以通過`in`運算符、`hasOwnPreperty()`和`propertyIsEnumerable()`方法來檢測屬性。
- `in`運算符左側是屬性名(字符串),右側是對象。如果對象的自由屬性或繼承屬性中包含這個屬性則返回`true`。
- 對象的`hasOwnPreperty()`方法用來檢測給定的名字是否是對象的自有屬性。對于繼承屬性將返回`false`。
- `propertyIsEnumerable()`只有檢測到是自由屬性且這個屬性可枚舉為`true`時它才返回`true`。
##<a name="no5">6.5 枚舉屬性</a>
> 略
##<a name="no6">6.6 屬性`getter`和`setter`</a>
> 略
##<a name="no7">6.7 屬性的特性</a>
> 數據屬性的4個特性分別是它的值(`value`)、可寫性(`writable`)、可枚舉性(`enumerable`)和可配置性(`configurable`)。
##<a name="no8">6.8 對象的三個屬性</a>
> 每個對象都有與之相關的原型(`prototype`)、類(`class`)和可擴展性(`extensible attribute`)。
###6.8.1 原型屬性
> 對象的原型屬性是用來繼承屬性的。
###6.8.2 類屬性
> 對象的類屬性是一個字符串,用以表示對象的類型信息。
###6.8.3 可擴展性
> 對象的可擴展性用以表示是否可以給對象添加新屬性。所有內置對象和自定義對象都是顯示可擴展的,宿主對象的可擴展性是由JS引擎定義的。
##<a name="no9">6.9 序列化對象</a>
> 對象序列化是指將對象的狀態轉換為字符串,也可將空字符串還原為對象。
**ECMAScript5提供了內置函數`JSON.stringify()`和`JSON.parse()`用來序列化和還原JS對象。**
##<a name="no10">6.10 對象方法</a>
###6.10.1 toString()方法
> 它將放回一個表示調用這個方法的對象只的字符串。
###6.10.2 toLocaleString()方法
> 這個方法返回一個表示這個對象的本地化字符串。
###6.10.3 toJSON()方法
> 返回值是序列化的結果。
###6.10.4 valueOf()方法
> `valueOf()`方法和`toString()`方法非常相似,但往往當JS需要將對象轉換為某種原始值而非字符串的時候才會調用它,尤其是轉換為數字的時候。具體到9.6.6章節討論如果給自定義對象類型定義`valueOf()`方法。