object.defineProperty()方法用于在一个对象上定义一个新属性,或者修改已存在的属性,最终返回一个对象。
语法:Object.defineProperty(obj,prop,desc) 三者均必须
obj:目标对象 prop:需定义或修改的属性名 desc:目标属性所拥有的配置特性
desc包含的全部配置项如下:
value:设定属性的值
writable:值是否可以被编辑重写 boolean 默认值true--可编辑/可重写
enumerable:目标属性是否可以被枚举 boolean 默认值true--可枚举,会被遍历出来
configurable:描述属性是否可以配置、是否可以删除 boolean 默认值true--可配置/可删除
get() :当获取值时触发的函数 ,不设置时为undefined
set():当设置值时触发的函数,设置的新值可以通过value拿到,不设置时为undefined
注意:当使用了存取起get和set方法后,不能使用value和writable,否则会直接报错。
get 和set不必成对存在,可以只有一个。
举例:
let obj={name:"d",age:20};
console.log(obj);
//{ name: 'd', age: 20 }
console.log(Object.keys(obj));
//[ 'name', 'age' ]
Object.defineProperty(obj,"sex",{
value:"girl",
writable:true,
enumerable:true,
configurable:true
});
console.log(obj);
//{ name: 'd', age: 20, sex: 'girl' }
obj.sex="boy";
console.log(obj);
//{ name: 'd', age: 20, sex: 'boy' }
console.log(Object.keys(obj));
//[ 'name', 'age', 'sex' ]
obj.name="dlj";
console.log(obj);
//{ name: 'dlj', age: 20, sex: 'boy' }
delete obj.age;
console.log(obj);
//{ name: 'dlj', sex: 'boy' }
Object.defineProperty(obj,"birth",{
value:"2020-09-09",
writable:false,
enumerable:false,
configurable:false
});
console.log(obj);
//{ name: 'dlj', sex: 'boy', birth: '2020-09-09' } enumerable:true
//{ name: 'dlj', sex: 'boy'} enumerable:false
// obj.birth="2121-09-09";
// console.log(obj);
//TypeError: Cannot assign to read only property 'birth' of object '#<Object>'
delete obj.brith;
console.log(obj);
//{ name: 'dlj', sex: 'boy', birth: '2020-09-09' } enumerable:true
//{ name: 'dlj', sex: 'boy' } enumerable:false
console.log(Object.keys(obj));
//[ 'name', 'sex', 'birth' ] enumerable:true
//[ 'name', 'sex' ] enumerable:false
let count=10;
Object.defineProperty(obj,"birth1",{
get:function(){
return count;
},
set:function(val){
count=val;
}
});
console.log(obj.birth1);
//10
obj.birth1=22;
console.log(count);
//22
console.log(Object.keys(obj));
//[ 'name', 'sex' ]