Object.defineProperty

230 阅读1分钟

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)

参考MDN文档