1 對象的數據屬性 2 Configurable,Enumerable,Writable,Value 3 4 var person = {} 5 Object.defineProperty(person,'name',{ 6 configurable:false,//可否使用delete、可否需改屬性特性、或可否修改訪問器屬性、,false爲不可從新定義,默認值爲true 7 enumerable:false,//對象屬性是否可經過for-in循環,flase爲不可循環,默認值爲true 8 writable:false,//對象屬性是否可修改,flase爲不可修改,默認值爲true 9 value:'xiaoming' //對象屬性的默認值,默認值爲undefined 10 }); 11 12 //value 13 console.log(person);//xiaoming,默認value 14 15 //writable 16 person.name="qiang"; 17 console.log(person);//xiaoming,不可修改value 18 19 //enumerable 20 for(var i in person){ 21 console.log(person[i]) //無結果,不可循環 22 } 23 24 //configurable 25 delete person.name 26 console.log(person.name)//xiaoming,不可刪除 27 28 Object.defineProperty(person,'name',{ 29 configurable:true //不可修改,將拋出錯誤 30 }); 31 58 訪問器屬性 59 getter,setter 60 61 var book = { 62 _year: 2004,//屬性前面加_,表明屬性只能經過對象方法訪問 63 edition: 0 64 } 65 Object.defineProperty(book,'year',{ 66 get: function(){ 67 return this._year; 68 }, 69 set: function(newValue){ 70 if(newValue > 2004){ 71 this._year = newValue; 72 this.edition += newValue - 2004 73 } 74 } 75 }); 76 console.log(book.year)//2004 77 book.year = 2006; 78 console.log(book.year)//2006 79 console.log(book.edition)//2 80 99 定義多個屬性 100 Object.defineProperties 101 102 var book = {}; 103 Object.defineProperties(book, { 104 _year: { 105 value:2004, 106 writable:true 107 }, 108 edition: { 109 value: 0, 110 writable:true 111 }, 112 year: { 113 get: function() { 114 return this._year; 115 }, 116 set: function(newValue) { 117 if (newValue > 2004) { 118 this._year = newValue; 119 this.edition += newValue - 2004 120 } 121 } 122 } 123 }); 124 console.log(book.year) //2004 125 book.year = 2006; 126 console.log(book.year) //2006 127 console.log(book.edition) //2 128 154 讀取屬性 155 var book = {}; 156 Object.defineProperties(book, { 157 _year: { 158 value:2004, 159 writable:true 160 }, 161 edition: { 162 value: 0, 163 writable:true 164 }, 165 year: { 166 get: function() { 167 return this._year; 168 }, 169 set: function(newValue) { 170 if (newValue > 2004) { 171 this._year = newValue; 172 this.edition += newValue - 2004 173 } 174 } 175 } 176 }); 177 console.log(book.year) //2004 178 book.year = 2006; 179 console.log(book.year) //2006 180 console.log(book.edition) //2 181 //讀取屬性 182 var descriptor__year = Object.getOwnPropertyDescriptor(book,'_year'); 183 var descriptor_year = Object.getOwnPropertyDescriptor(book,'year'); 184 213 console.log(descriptor__year ) 214 215 216 console.log(descriptor_year )
Object.defineProperty(obj, prop, descriptor)也能夠只有前兩個。
obj
prop
descriptor
對象裏目前存在的屬性描述符有兩種主要形式:數據描述符和存取描述符。數據描述符是一個具備值的屬性,該值多是可寫的,也可能不是可寫的。存取描述符是由getter-setter函數對描述的屬性。描述符必須是這兩種形式之一;不能同時是二者。函數
數據描述符和存取描述符均具備如下可選鍵值:this
configurable
描述符
纔可以被改變,同時該屬性也能從對應的對象上被刪除。
默認爲 false。
enumerable
enumerable
爲
true
時,該屬性纔可以出如今對象的枚舉屬性中。
默認爲 false。
數據描述符同時具備如下可選鍵值:spa
value
undefined
。
writable
writable
爲
true
時,
value
才能被
賦值運算符改變。
默認爲 false。
存取描述符同時具備如下可選鍵值:code
get
undefined
。當訪問該屬性時,該方法會被執行,方法執行時沒有參數傳入,可是會傳入
this
對象(因爲繼承關係,這裏的
this
並不必定是定義該屬性的對象)。
undefined
。
set
undefined
。當屬性值修改時,觸發執行該方法。該方法將接受惟一參數,即該屬性新的參數值。
undefined
。
configurable | enumerable | value | writable | get | set | |
數據描述符 | Yes | Yes | Yes | Yes | No | No |
存取描述符 | Yes | Yes | No | No | Yes | Yes |
若是一個描述符不具備value,writable,get 和 set 任意一個關鍵字,那麼它將被認爲是一個數據描述符。若是一個描述符同時有(value或writable)和(get或set)關鍵字,將會產生一個異常。對象