在ECMAScript中有兩種屬性:數據屬性和訪問器屬性
1、數據屬性
configurable:表示能否通過delete刪除屬性從而重新定義屬性;或者能否修改屬性的特性;或者能否把屬性修改為訪問器屬性。
enumerable:表示能否通過for-in循環返回屬性。
writable:表示能否修改屬性的值。
value:包含這個屬性的數據值,讀取屬性的時候,從這個位置讀;寫入屬性的時候,把新的值保存在這個位置。
2、訪問器屬性
configurable:表示能否通過delete刪除屬性從而重新定義屬性;或者能否修改屬性的特性;或者能否把屬性修改為訪問器屬性。
enumerable:表示能否通過for-in 循環返回屬性。
get:在讀取屬性的時候調用的函數。
set:在設置屬性的時候調用的函數。
①對於直接在對象上定義的屬性,configurable、enumerable、writable的默認值為true:
var person={}; person.name="張三"; console.log(Object.getOwnPeopertyDescriptor(person,'name')) //Object {value: "張三", writable: true, enumerable: true, configurable: true}
②對於通過Object.defineProperty()或者Object.defineProperties()定義的屬性,configurable、enumerable、writable的默認值為false:
var person={}; Object.defineProperty(person,'name',{value:'張三'}); console.log(Object.getOwnPropertyDescriptor(person,'name'));//Object {value: "張三", writable: false, enumerable: false, configurable: false}
③當configurable設置為false時,所有的屬性就不能重新設定,也不能刪除了。但是當configurable設置為false時,writable設置為true時,value屬性的值是可以被直接更改的,但是當writable再次設置為false時,writable屬性就不能重新設置回true了。
var b={}; Object.defineProperty(b,'b',{configurable:false,writable:true}); Object.getOwnPropertyDescriptor(b,'b')//Object {value: undefined, writable: true, enumerable: false, configurable: false} Object.defineProperty(b,'b',{writable:false}) Object.getOwnPropertyDescriptor(b,'b')//Object {value: undefined, writable: false, enumerable: false, configurable: false} Object.defineProperty(b,'b',{writable:true})//Uncaught TypeError: Cannot redefine property: b(…)
④訪問器屬性不能直接定義,只能通過Object.defineProperty()來定義。
⑤當訪問器屬性只設置了get屬性,那麼該屬性是只讀的;反之,當訪問器屬性只設置了set屬性,那麼該屬性是只寫的。
⑥一次性定義多個屬性,可以用Object.defineProperties()
var person={}; Object.defineProperties(person,{name:{value:'張三',configurable:true},sex:{value:'男',writable:true}}); Object.getOwnPropertyDescriptor(person,'name')//Object {value: "張三", writable: false, enumerable: false, configurable: true} Object.getOwnPropertyDescriptor(person,'sex')//Object {value: "男", writable: true, enumerable: false, configurable: false}