Object.defineProperty() 在对象上定义/修改属性
语法:Object.defineProperty(obj对象,prop属性,描述符)
属性:
value:默认值(给对象属性赋值)
writable: 是否能够写/修改 true | false
configurable: 是否能够删除 true | false
enumerable:是否可枚举(遍历) true | false
get:获取属性值
set:设置属性值
注意:使用get或set方法时,不能使用value和writable属性
value 给对象属性赋值
var obj={
name:'李'
}
console.log(obj); //{name: "李"}
Object.defineProperty(obj,'age',{
value:19
});
console.log(obj); //{name: "李", age: 19}
writable 是否能够写/修改属性值
var obj={
name:'李'
}
//第一种情况 writable为false,不可修改
Object.defineProperty(obj,'age',{
value:19,
writable:false
});
obj.age=22;
console.log(obj.age); //19
//第二种情况 writable为true,可修改
Object.defineProperty(obj,'age',{
value:19,
writable:true
});
obj.age=22;
console.log(obj.age); //22
enumerable 是否可枚举(遍历)属性
var obj={
name:'李'
}
//第一种情况 enumerable为false,不可遍历
Object.defineProperty(obj,'age',{
value:19,
writable:false,
enumerable:false
});
for(var attr in obj){
console.log(attr); //name
}
//第二种情况 enumerable为true,可遍历
Object.defineProperty(obj,'age',{
value:19,
writable:false,
enumerable:true
});
for(var attr in obj){
console.log(attr); // name age
}
configurable 是否能够删除属性
var obj={
name:'李'
}
//第一种情况 configurable为false,不可删除属性
Object.defineProperty(obj,'age',{
value:19,
writable:false,
enumerable:false,
configurable:false
});
delete obj.age;
console.log(obj); //{name: "李", age: 19}
//第二种情况 configurable为true,不可删除属性
Object.defineProperty(obj,'age',{
value:19,
writable:false,
enumerable:false,
configurable:true
});
delete obj.age;
console.log(obj); //{name: "李"}
get 获取属性值 | set 设置属性值
var obj = {
name: '李'
}
var n=10;
//当set没有传参时,属性的值无法改变
Object.defineProperty(obj, 'age', {
get:function(){
return n;
},
set:function(){
}
});
console.log(obj.age); //10
obj.age=25;
console.log(obj.age); //10
//当set传参时,属性的值可以改变
Object.defineProperty(obj, 'age', {
get:function(){
return n;
},
set:function(m){
n=m;
}
});
console.log(obj.age); //10
obj.age=25;
console.log(obj.age); //25
注意:在使用Object.defineProperty()属性给对象添加或修改属性时,如果不设置属性的值,则writable、configurable、enumerable都默认为是false。