var person={ name:"Nicholas", age:29, job:"Software Engineer", sayName:function(){ alert(this.name); } };
1.属性类型
(1)数据属性
[[configurable]]:表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为访问器属性。默认为true。
[[Enumerable]]:表示能否通过for-in循环返回属性。默认为true。
[[Writable]]:表示能否修改属性的值。默认为true。
[[Value]]:包含这个属性的数据值。默认为undefined。
var person={} Object.defineProperty(person,"name",{ writable:false, configurable:false, value:"Nicholas" }); alert(person.name);//"Nicholas" person.name="Greg"; alert(person.name);//"Nicholas" delete person.name; alert(person.name);//"Nicholas"
不过建议在IE8不使用Object.defineProperty()方法
(2)访问器属性
[[configurable]]:表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为访问器属性。默认为true。
[[Enumerable]]:表示能否通过for-in循环返回属性。默认为true。
[[Get]]:在读取属性时调用的函数。默认为undefined。
[[Set]]:在写入属性时调用的函数。默认为undefined。
//待完善
2.定义多个属性
var book={}; Object.defineProperities(book,{ _year:{ value:2004 }, edition:{ value:1 }, year:{ get function(){ return this._year; }, set:function(newValue){ if(newValue>2004){ this._year=newValue; this.edition+=newValue-2004; } } } });
3.读取属性的特性
var book={}; Object.defineProperities(book,{ _year:{ value:2004 }, edition:{ value:1 }, year:{ get function(){ return this._year; }, set:function(newValue){ if(newValue>2004){ this._year=newValue; this.edition+=newValue-2004; } } } }); var descriptor = Object.getOwnPropertyDescriptior(book,"_year"); alert(descriptor.value);//2004 alert(descriptor.configurable);//fasle alert(typeof descriptor.get);//"undefined" var descriptor = Object.getOwnPropertyDescriptior(book,"year"); alert(descriptor.value);//undefined alert(descriptor.configurable);//fasle alert(typeof descriptor.get);//"function"