Object.defineProperty( )
1.概述
Object.defineProperty()
用于直接在一个对象上定义一个新属性,或修改一个现有属性,并返回该对象。
2.语法
Object.defineProperty(obj,prop,descriptor)
1)参数
obj——要定义属性的当前对象。
prop——要定义或修改的属性的名称。
descriptor——要定义或修改的属性描述符。对象里目前存在的属性描述符有两种主要形式:数据描述符
和存取描述符
。
2)返回值
返回一个被传递给函数的对象。
3.描述
数据描述符
数据描述符
是一个具有值的属性,该值可以是 可写 / 不可写的。
存取描述符
存取描述符
是由 getter 函数和 setter 函数所描述的属性。
3.示例
1).创建属性:如果对象中不存在指定的属性,Object.defineProperty()
会创建这个属性。
//创建一个新对象
const user = {}
//在对象中添加一个属性与数据描述符
Object.defineProperty(user,'age',{
value:18,
writable:true,
enumerable : true,
configurable : true
});
console.log(user.age); //18;对象user拥有了属性age,值为18
//设置值
user.age=25
console.log(user.age); //25
//在对象中添加一个设置了存取描述符属性
const temp=20
Object.defineProperty(user,'newAge',{
get() {
//当获取值的时候触发的函数
return temp
},
set(val) {
//当设置值的时候触发的函数,设置的新值通过参数value拿到
temp = val;
},
enumerable : true,
configurable : true
});
//获取值
console.log(user.newAge); //20; 对象user拥有了属性newAge,值为20
注意:
1.数据描述符和存取描述符不能混合使用
2.当使用了getter或setter方法,不允许使用writable和value这两个属性
2).修改属性
- Writable 属性
writable
设置为 false
时,该属性是不可写的,不能被重新赋值。
const person={};
Object.defineProperty(person,'age',{
age:18,
writable:false // writable默认为false,不允许修改person的age属性值
});
person.age=20;
console.log(person.age); //18
writable
设置为 true
时,该属性可写,能被重新赋值。
const person={};
Object.defineProperty(person,'age',{
age:18,
writable:true // writable: 允许修改person的age属性值
});
person.age=20;
console.log(person.age); //20
- Enumerable 属性
Configurable 属性
表示属性是否能在for...in 或者 Object.keys()遍历中被枚举
- Configurable 属性
Configurable 属性
表示对象的属性是否可以被删除