Object.defineProperty解析

定义

  1. 直接定义一个对象上的新属性或者修改一个对象上的现有属性,并返回此对象

  2. 接收的参数
    (1) target 目标对象
    (2) key 新的属性名或者需要修改的属性名(字符串)
    (3) desc 属性描述符[ 数据属性描述符(默认都为false ),访问器属性描述符 ](对象)

    const obj = { name: 'nano' }
    Object.defineProperty( obj, 'name', {
      value: 'roily',
      configure: false,
      enumerable:false,
      writable:false       
    } )
    console.log( obj ) --> { name:'roily' }
  3. 属性描述符
    (1) value
    定义: 属性的值
    默认值:undefined

(2) configure
定义: 是否可配置(可删除)
默认值:false

(3) enumerable
定义: 是否可枚举(for..key..,Object.keys())
默认值:false

(4) writable
定义: 是否可写(可修改)
默认值:false

  1. 访问器属性描述符
    定义:
    (1) 隐藏某一个私有属性,不希望被外界直接使用
    (2) 截获某一个属性访问和设置值的过程
    const obj = { _name:'nano' }
    Object.defineProperty( obj, 'name',{
      get(){
        return this._name
      },
      set(value){
        this._name = value
      },
      configure: true,
      enumerable: true
    } )
    console.log( obj ) --> { _name:'nano' }
    console.log( obj.name ) --> 'nano'

    注意:
    (1)定义的访问器属性并不会直接出现在对象里
    (2)访问器属性描述符不能与value,writable这两个属性描述符一起使用

补充

  1. Object.defineProperties
    定义: 直接定义多个对象上的新属性或者修改一个对象上的现有属性,并返回此对象

  2. 接收的参数
    (1) target 目标对象
    (2) descs 多个属性描述符集合(对象)

  3. 使用

    let obj = { _age:19 }
    Object.defineProperties(obj,{
      name:{
          value: 'abc',
          configure: true,
          enumerable: true,
          writable: true
      },
      age:{
          configure: true,
          enumerable: true,
          get( ){
            return this._age
          },
          set(value ){
            this._age = value
          }
      }
    })

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!