###理解對象 ECMA-262把對象定義為:“無序屬性的集合,其屬性可以包含基本值、對象或者函數。”嚴格來講,這就相當於說對象是一組沒有特定順序的值。對象的每個屬性或方法都有一個名字,而每個名字都映射到一個值。 我們可以把ECMAScript的對象想象成散列表:無非就是一組名值對,其中的值可以是數 ...
###理解對象 ECMA-262把對象定義為:“無序屬性的集合,其屬性可以包含基本值、對象或者函數。”嚴格來講,這就相當於說對象是一組沒有特定順序的值。對象的每個屬性或方法都有一個名字,而每個名字都映射到一個值。
我們可以把ECMAScript的對象想象成散列表:無非就是一組名值對,其中的值可以是數據或函數。
每個對象都是基於一個引用類型創建的,即創建自定義對象的最簡單方式就是創建一個Object的實例,然後再為它添加屬性和方法
早期的JavaScript開發人員使用這個模式創建新屬性
幾年後,對象字面量成為創建這種對象的首選模式。
這些屬性在創建時都帶有一些特征值,JavaScript通過這些特征值來定義它們的行為
屬性類型
ECMA-262第5版在定義了只有內部才用的特性時,描述了屬性的各種特征,這些特征是為了實現JavaScript引擎用的,因此在JavaScript中不能直接訪問它們。
ECMAScript中有兩種屬性:數據屬性和訪問器屬性
####1、數據屬性 數據屬性包含一個數據值的位置,這個位置可以讀取和寫入值,可通過對象直接定義的屬性。數據屬性有四個描述其行為的特性
| 特性 | 值 | 解析 | | :---- |:----:| :----| | configurable | true/false | 是否可以通過delete刪除屬性,能否修改屬性的特性,能否把屬性修改為訪問器屬性,預設true | | enumerable | true/false | 是否可以通過for in迴圈返回,預設true | | writable | true/false | 是否可以修改屬性的值,預設true | | value | undefined | 設置屬性的值,預設undefined |
####2、訪問器屬性 訪問器屬性只能通過Object.defineProperty()方法來定義,不能通過對象直接定義,不能直接存儲數據值。訪問器屬性有四個描述其行為的特性
| 特性 | 值 | 解析 | | :---- |:----:| :----| | configurable | true/false | 是否可以通過delete刪除屬性,能否修改屬性的特性,能否把屬性修改為訪問器屬性,預設true | | enumerable | true/false | 是否可以通過for in迴圈返回,預設true| | get | function | 讀取屬性值時調用的函數 | | set | function | 修改屬性值時調用的函數 |
####3、修改屬性預設的特性 要修改屬性預設的特性,必須使用ECMAScript5的Object.defineProperty()方法,這個方法接收三個參數:屬性所在的對象、屬性的名字和一個描述符對象(IE9+)
註意:當使用Obeject.defineProperty()定義對象屬性時,同時指定了get/set和value/writable時,會報錯
當使用Object.defineProperty()來定義對象屬性時,預設為訪問器屬性,但是如果指定了value或writable特性時,該屬性被定義為數據屬性
修改多個屬性預設的特性:object.definePropertues(),以上代碼在book對外商定義了兩個數據屬性(_year和edition)和一個訪問器屬性(year),與下麵定義的對象相同
####4、讀取屬性的特性 要讀取屬性的特性,必須使用ECMAScript5的:Object.getOwnPropertyDescriptor()方法,這個方法接收兩個參數:屬性所在的對象和要讀取其描述符的屬性名稱