對象的數據屬性
阿新 • • 發佈:2019-01-08
現在 edit set cal courier -h syntax pre zh-cn
參數
屬性描述符
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為不可修改,默認值為true9 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 //configurable25 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函數對描述的屬性。描述符必須是這兩種形式之一;不能同時是兩者。
數據描述符和存取描述符均具有以下可選鍵值:
configurable
- 當且僅當該屬性的 configurable 為 true 時,該屬性
描述符
才能夠被改變,同時該屬性也能從對應的對象上被刪除。默認為 false。 enumerable
- 當且僅當該屬性的
enumerable
為true
時,該屬性才能夠出現在對象的枚舉屬性中。默認為 false。
數據描述符同時具有以下可選鍵值:
value
- 該屬性對應的值。可以是任何有效的 JavaScript 值(數值,對象,函數等)。默認為
undefined
。 writable
- 當且僅當該屬性的
writable
為true
時,value
才能被賦值運算符改變。默認為 false。
存取描述符同時具有以下可選鍵值:
get
- 一個給屬性提供 getter 的方法,如果沒有 getter 則為
undefined
。當訪問該屬性時,該方法會被執行,方法執行時沒有參數傳入,但是會傳入this
對象(由於繼承關系,這裏的this
並不一定是定義該屬性的對象)。 - 默認為
undefined
。 set
- 一個給屬性提供 setter 的方法,如果沒有 setter 則為
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)關鍵字,將會產生一個異常。
什麽是屬性描述符?https://www.jianshu.com/p/19529527df80
對象的數據屬性