對象的數據屬性

  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
當且僅當該屬性的 configurable 爲 true 時,該屬性 描述符纔可以被改變,同時該屬性也能從對應的對象上被刪除。 默認爲 false
enumerable
當且僅當該屬性的 enumerabletrue時,該屬性纔可以出如今對象的枚舉屬性中。 默認爲 false

數據描述符同時具備如下可選鍵值spa

value
該屬性對應的值。能夠是任何有效的 JavaScript 值(數值,對象,函數等)。 默認爲 undefined
writable
當且僅當該屬性的 writabletrue時, value才能被 賦值運算符改變。 默認爲 false

存取描述符同時具備如下可選鍵值code

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

相關文章
相關標籤/搜索