一、访问器属性:
1、Configurable:表示能否通过delete删除属性,从而重新定义属性,能否修改属性的特性,或者能否把属性修改为数据属性。对于直接在对象上定义的属性,这个特性的默认值为true,表示可以使用delete删除该属性;对于使用Object.defineProperty方式定义的属性,这个特性默认值是false,表示不能使用delete删除该属性。
举例:
var obj = {}; Object.defineProperty(obj,'name',{ value : '何莉莉' }); obj.age='23'; delete obj.name;//返回值false,严格模式下会报错,属性不会被正常删除。 delete obj.age;//返回值true,属性可以被正常删除。
2、Enumerable:表示能否通过for - in 循环返回属性。对于直接在对象上定义的属性,这个特性的默认值为true,表示可以使用for - in循环返回属性;对于使用Object.defineProperty方式定义的属性,这个特性的默认值为false,表示不能使用for - in 循环返回属性。
for(one in obj){ console.log(one+": "+obj[one]); } //结果中不包含使用Object.defineProperty定义的name属性结果 //age: 23
3.get:在读取属性时调用的函数。默认值undefined。
4.set:在写入属性时调用的函数。默认值undefined。
//下面以类似的双向绑定为例,表明给属性赋值时候,如何使用set和get方法。 var obj = { temp : '', array : [], push : function(val){ this.temp = val; } }; Object.defineProperty(obj,'temp',{ set:function(val){ obj.array.push(val); }, get:function(){ return obj.array; } }); obj.push("亲"); obj.push("爱"); obj.push("的"); obj.push("你");
//结果
obj.array;//直接从对象中获取
obj.temp;//走get方法
二、定义多个属性
ECMAScript5定义了一个Object.definPropertis()方法。利用此方法可以通过描述符一次定义多个属性。这个方法接受两个对象参数:第一个对象是添加和修改其属性的对象,第二个对象的属性与第一个对象中要添加或修改的属性一一对应。
例如:
var book = {};
Object.defineProperties(book,{ _year:{ writable : true, value : 2004 }, edition:{ writable:true, value:1 }, year:{ get:function(){ return this._year; }, set:function(newValue){ if(newValue > 2004){ this._year = newValue; this.edition += newValue - 2004; } } } });
//结果:
三、读取属性的四个特性
var remote = Object.getOwnPropertyDescriptor(book,'_year'); for(var node in remote){ console.log(node + ":" + remote[node]); } //结果