Object对象私有方法
Object.getOwnPropertyDescriptor(obj,attr) 获取一条属性的描述对象
参数
obj 属性所在的对象
attr 属性名,必需为字符串类型
返回值
返回属性对应描述的对象,如果属性不存在返回undefined
注意
1、此方法在ES5里就有,但ES5里规定第一个参数必需为对象,否则报错;
2、ES6里增加了默认转换的功能,第一个参数如果不是对象类型,会先自动转成对象类型;
3、此方法只能取对象自身的属性,取不到继承的属性;
const gpd=Object.getOwnPropertyDescriptor;
//Object.getOwnPropertyDescriptor(obj,attr)
//ES6会把第一个非对象的参数转成对象
console.log(gpd('str','length')); //{value: 3, writable: false, enumerable: false, configurable: false}
console.log(gpd({},'toString')); //undefined
Object.getOwnPropertyDescriptors(obj) 获取所有属性的描述对象(ES7新增)
与上面方法的区别
1、参数只有一个(对象);
2、永远返回对象,即使没有属性也会返回一个空对象;
3、Object.defineProperty(obj,prop,descriptor) 通过定义属性描述对象,来定义或修改一条属性;
const obj={
name:'luobing',
age:18
};
console.log(Object.getOwnPropertyDescriptors(obj));
//{
//name: {value: "kaivon", writable: true, enumerable: true, configurable: true}
//age: {value: 18, writable: true, enumerable: true, configurable: true}
//}
Object.defineProperty(obj,prop,descriptor) 通过定义属性描述对象,来定义或修改一条属性
功能
1、修改一条原有属性;
2、增加一条新属性;
3、都能操作属性描述对象;
参数
obj 属性所在的对象(必选)
prop 属性名称,字符串(必选)
descriptor 属性描述对象(必选),里面的字段是可选的
value 默认为undefined
writable 默认为false
enumerable 默认为false
configurable默认为false
get 默认为undefined
set 默认为undefined
返回值
返回修改后的对象
注意
1、如果属性描述对象的configurable为false,此方法不能用;
2、如果属性描述对象的writable为false,不能设置属性的值;
//Object.defineProperties(obj,props)
const div={};
Object.defineProperties(div,{
'name':{
value:'luobing',
writable :true,
enumerable:true,
configurable:true,
},
'age':{
value:18,
writable :false,
enumerable:true,
configurable:false,
},
'work':{
enumerable:true,
configurable:true,
get(){
console.log('你获取了工作')
},
set(){
console.log('你设置了工作')
}
},
'author':{
value:{
'name':'luobing',
'wechat':'kaivon',
'QQ':356985332,
'email':'luobing@qq.com'
},
enumerable:false
}
});
console.log(Object.getOwnPropertyDescriptors(div));
div.work;
div.work='133';
for(let attr in div){
console.log(attr);
}
Object.defineProperties(obj,props);
用法与上面的一样
注意:后两个方法都会很消耗性能,尽量不要大量用