对象的数据属性

  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

 
原文地址:https://www.cnblogs.com/lujunan/p/10241044.html