2)属性类型
数据属性(重要的话,在本身是true,在方法中默认是false
[[Configurable]] 能否删除从而重新定义,能否修改属性的特性,能否把属性改为访问器属性
[[Enumerable]]能否for-in
[[writable]]能否写
[[Value]]读写
要修改属性的默认特性,可以使用Object.defineProperty(a,b,c)分别是属性所在的对象,属性的名字,一个描叙符对象(上面的四个中的一个或者多个
var person=new Object();
Object.defineProperty(person,"name",{writable:false,value:"fuck"});
alert(person.name);
person.name="you";//writable:false并不能修改
alert(person.name);
访问器属性
[[Configurable]]能否删稠从而重新定义,能否修改属性的特性,能否把属性改为数据属性
[[Enumerable]]for-in
[[Get]]
[[Set]]
访问器属性不能直接定义,只能通过Object.defineProperty(a,b,c)来定义
var book={
_year:2004,
edition:1
};
Object.defineProperty(book,"year",{
get:function () {
return this._year;
},
set:function (a){
if(a>2004){
this._year=a;
this.edition+=a-2004;
}
}
});
book.year=2006;
alert(book.edition);//3
由于实际情况下一次要修改多个属性,所以有方法Object.defineProperties(a,b)分别为要修改的对象,第二个对象是对象的属性和修改的属性合在一起(请注意格式
var book={}; Object.defineProperties(book,{//字面量 _year:{ writable: true,//很关键 value:2004 },//逗号 edition:{ writable: true, value:1 }, year:{ set:function (a) { if(a>2004){ this._year=a; this.edition+=a-2004; } }, get:function () { return this._year; } } }); console.log(book.year,book.edition); book.year=2007; console.log(book);
读取属性特性
Object.getOwnpropertyDescriptor(a,b)属性所在的对象和属性名称
book.year=2007; var a=Object.getOwnPropertyDescriptor(book,"_year"); console.log(a.value,a.configurable,a.writalbe);