Object.defineProperty基本使用
Object.defineProperty 方法动态的在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此对象。
方法定义
defineProperty(o: any, p: PropertyKey, attributes: PropertyDescriptor & ThisType<any>): any;
需要传递三个参数
- 第一个参数: 添加或修改属性的对象
- 第二个参数: 属性名
- 第三个参数: 属性的描述符对象
function Circle () {
}
const circle = new Circle()
// 给对象circle添加属性radius且值为10
Object.defineProperty(circle, "radius", {
value: 10,
writable: true
})
// 给对象circle添加属性diameter 提供get和set方法
Object.defineProperty(circle, "diameter", {
get() {
return this.radius * 2
},
set(newValue) {
this.radius = newValue * 0.5
}
})
属性描述符类型
通过defineProperty函数的第三个参数决定动态添加的属性的类型. 属性分类计算属性和存储属性
计算属性的属性描述符对象需要提供get和set方法
- 当对
计算属性进行访问 会调用get方法 内部可以访问this - 当对
计算属性进行赋值 会调用set方法newValue形参代表外界的赋值data 内部可访问this
存储属性的属性描述符value属性表示存储属性的值 writable属性表示属性值是否可以修改
属性描述对象其它属性
configurable
configurable默认为false 决定当前属性的描述符是否能被修改和删除。
enumerable
enumerable默认值为false 决定属性是否会出现在枚举对象属性中 如
// 枚举对象属性一
for (var property in circle){
console.log("属性名:%s", property);
}
// 枚举对象二
const keys = Object.keys(circle)
console.log(keys)