1. 定义
Object.defineProperty()方法是给对象的原型对象添加属性或者修改它的现有属性,返回值为新的对象
2. 语法
Object.defineProperty(要操作的对象名,'需要添加或修改的属性名',对属性的描述),其中描述符分为:数据描述符或存取描述符
2.1 数据描述符
{
value:,//属性值,必须写
writable:,//是否可改写该属性值,默认false
configurable: ,//是否可删除该属性,默认false。为true时,可更改writable的状态false->true,可再次添加该对象的属性
enumerable: //是否可遍历属性名 默认false
}
案例:
let obj2 = {};
Object.defineProperty(obj2,'teacher',{
value:11, //必须写
writable:true, //默认为false(不可改写),可改写属性值
//true,打印60;false,打印11
configurable:true,
enumerable:true,//默认为false(不可遍历),定义了对象的属性是否可以在for...in 循环 和 Object.keys循环遍历
});
Object.defineProperty(obj2,'singer',{
value:22,
enumerable:true,//默认为false(不可遍历),定义了对象的属性是否可以在for...in 循环 和 Object.keys循环遍历
});
Object.defineProperty(obj2,'doctor',{
value:33,
configurable:true, //默认为false(不可删除),对象的属性是否可以被删除。但若writable原值为false,可改为true
});
Object.defineProperty(obj2,'doctor',{ //configurable:true,可改写writable为true
value:33,
writable:true,
configurable:true,
});
obj2.teacher = 60;
console.log(obj2); //{teacher: 60, singer: 22, doctor: 33}
console.log(Object.keys(obj2)); //['teacher', 'singer'] //enumerable:true遍历obj2的键名
obj2.doctor = 44;
console.log(obj2); //{teacher: 60, singer: 22, doctor: 44}
delete(obj2.doctor); //删除obj2的'doctor'属性
console.log(obj2); //{teacher: 60, singer: 22}
obj2.doctor = 12; //可给obj2添加新属性
console.log(obj2); //{teacher: 60, singer: 22, doctor: 12}
2.2 存取描述符——get,set
let obj = {};
Object.defineProperty(obj,'birth',{
//存值操作
set(v){ console.log(v) },
//取值操作
get(){ return 20 }
});
obj.birth = '1998-06-13'; //走存值操作,set()执行后打印1998-06-13
console.log(obj.birth); //走取值操作,打印20