1. 程式人生 > >對象的數據屬性

對象的數據屬性

現在 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為不可修改,默認值為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函數對描述的屬性。描述符必須是這兩種形式之一;不能同時是兩者。

數據描述符和存取描述符均具有以下可選鍵值:

configurable
當且僅當該屬性的 configurable 為 true 時,該屬性描述符才能夠被改變,同時該屬性也能從對應的對象上被刪除。默認為 false
enumerable
當且僅當該屬性的enumerabletrue時,該屬性才能夠出現在對象的枚舉屬性中。默認為 false

數據描述符同時具有以下可選鍵值

value
該屬性對應的值。可以是任何有效的 JavaScript 值(數值,對象,函數等)。默認為 undefined
writable
當且僅當該屬性的writabletrue時,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

 

對象的數據屬性