在ECMAScript中有兩種屬性:數據屬性和訪問器屬性函數
一、數據屬性spa
configurable:表示可否經過delete刪除屬性從而從新定義屬性;或者可否修改屬性的特性;或者可否把屬性修改成訪問器屬性。code
enumerable:表示可否經過for-in循環返回屬性。對象
writable:表示可否修改屬性的值。blog
value:包含這個屬性的數據值,讀取屬性的時候,從這個位置讀;寫入屬性的時候,把新的值保存在這個位置。ip
二、訪問器屬性get
configurable:表示可否經過delete刪除屬性從而從新定義屬性;或者可否修改屬性的特性;或者可否把屬性修改成數據屬性。it
enumerable:表示可否經過for-in 循環返回屬性。console
get:在讀取屬性的時候調用的函數。table
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}
⑦查看對象對應的屬性的configurable、enumerable、writable的值能夠經過Object.getOwnPropertyDescriptor()方法。