JS面试题:Object.defineProperty

435 阅读2分钟

Object.defineProperty的作用就是直接在一个对象上定义一个新属性,或者修改一个已经存在的属性

Object.defineProperty(对象, 属性名称, 属性描述)
  1. 给obj定义一个属性a的值为1
    let obj = {}
    Object.defineProperty(obj, 'a', { value: 1 })
    console.log(obj) // {a: 1}
  1. writable表示目标属性是否可以被重新赋值

writable【顾名思义属性是否可以被重新赋值】接受数据类型为 boolean;writable默认为false,所以无法更改

    let obj = {}
    Object.defineProperty(obj, 'a', { value: 1 })
    obj.a = 2
    console.log(obj) // {a: 1}

想让属性a可以更改,则需要把writable变为true

    let obj = {}
    Object.defineProperty(obj, 'a', { value: 1, writable: true })
    obj.a = 2
    console.log(obj) // {a: 2}
  1. enumerable表示目标属性是否可以被枚举

enumerable表示目标属性是否可以被枚举,默认为false

    let obj = {}
    Object.defineProperty(obj, 'a', { value: 1 })
    console.log(Object.keys(obj)) // []

这里因为enumerable默认是false,所以这边无法被枚举,如果要想能被枚举则需要把enumerable改为true

    let obj = {}
    Object.defineProperty(obj, 'a', { value: 1, enumerable: true })
    console.log(Object.keys(obj)) // ['a']
  1. configurable表示目标属性是否可以被删除

configurable表示目标属性能否被删除,默认是false,不可以被删除

    let obj = {}
    Object.defineProperty(obj, 'a', { value: 1 })
    delete obj.a
    console.log(obj) // {a: 1}

把configurable变为true,则就可以删除

   let obj = {}
    Object.defineProperty(obj, 'a', { value: 1, configurable: true })
    delete obj.a
    console.log(obj) // {}
  1. get: 目标属性获取值的方法
    let obj = {}
    Object.defineProperty(obj, 'a', {
      get: function () {
        console.log("数据被获取了!!!")
        return 123
      }
    })
    console.log(obj.a)

输出结果:

数据被获取了!!!
123
  1. set: 目标属性设置值的方法
    let obj = {}
    Object.defineProperty(obj, 'a', {
      set: function (val) {
        console.log("设置值了:", val);
      }
    })
    obj.a = 123

输出结果:

设置值了: 123

切记:当使用了get或set方法,不允许使用writable和value这两个属性(如果使用,会直接报错滴)

  1. getOwnPropertyDescriptor获取对象的某个属性的描述
    let obj = {
      a: 123
    }
    let des = Object.getOwnPropertyDescriptor(obj, 'a')
    console.log(des)
    // {value: 123, writable: true, enumerable: true, configurable: true}

总结:

  1. value: 设置属性的值

  2. writable: 值是否可以重写; boolean类型,默认false

  3. enumerable: 目标属性是否可以被枚举; boolean类型,默认false

  4. configurable: 目标属性是否可以被删除或是否可以再次修改特性; boolean类型,默认false

  5. set: 目标属性设置值的方法

  6. get: 目标属性获取值的方法

  7. 当使用了get或set方法,不允许使用writable和value这两个属性(如果使用,会直接报错滴)

  8. 获取对象某个属性描述getOwnPropertyDescriptor