对象的属性可分为:1、数据属性;2、存取器属性;
数据属性有以下特性:1、值(value),2、可写(writable),3、可枚举(enumerable),4、可配置(configurable)
存取器属性有以下特性:1、读取(get),2、写入(set),3、可枚举(enumerable),4、可配置(configurable)
通过Object.getOwnPropertyDescriptor()获取对象的属性的特性描述符,第一个参数是对象,第二个参数是属性,
通过Objec.defineProperty()设置属性的特性,第一个参数是该对象,第二个参数是属性,第三个参数是属性描述符对象
Object.defineProperty()要么修改属性的特性,要么创建一个属性,在属性描述符中不必须全部传入的属性的特性,没有传入的特性默认为false或undefined
通过for/in枚举属性,
第三个参数属性描述符对象不必须传入四个参数,没有传入的特性默认为false或undefined
var obj={
"y":-1,
"m":"zhang"
};
//添加一个属性x,值为1,可配置,不可枚举,不可写
Object.defineProperty(obj,"x",{
configurable:true,
enumerable:false,
value:1
})
obj.x=0;
obj.x; //返回1,writable没有描述,默认为false
Object.defineProperty(obj,"x",{
value:0
});
obj.x; //返回0,有于fonfigurable为true,可配置,
obj.propertyIsEnumerable("x"); //返回false,属性是自身属性且可枚举的吗?不可枚举
var arr=[];
for (attrs in obj){
arr.push(attrs);
}
arr.length; //仅枚举到属性y,x不可枚举
console.log(Object.getOwnPropertyDescriptor(obj,"x"));//获取obj对象中x属性的特性描述符
console.log(Object.getOwnPropertyDescriptor(obj,"y"));//普通创建的属性的特性:可写,可枚举,可配置。
//Object.defineProperties()可以同时设置或创建多个属性,第一个参数是对象,第二个参数是一个对象映射表
Object.defineProperties(obj,{
z:{value:-2,writable:false,enumerable:false,configurable:false},
e:{value:-3,numerable:true},
m:{value:"yang"},
f:{value:"yang",writable:true,enumerable:true,configurable:true}
});
obj.f="zhang";
obj.f; //返回zhang
obj.m;//返回yang
Object.defineProperty(obj,"e",{ //属性不可配置时,不可以修改属性的可枚举性
//writable:false,
//numerable:true
value:5
//numerable:true
});
obj.e=3;
alert(obj.e);
//alert(obj.propertyIsEnumerable("e"));