defineProperty 的使用

106 阅读1分钟

defineProperty 的使用

defineProperty 是什么?

defineProperty 是 Object 原型方法,通过defineProperty方法 可以为对象新增属性。

通过defineProperty 方法新增属性和直接给对象新增属性的区别

  1. defineProperty 方法可为属性设置数据属性(configurable **enumerable ** writable

  2. 直接为对象添加属性 数据属性(configurable **enumerable ** writable )默认值都为 true

    let person={}
     Object.defineProperty(person,"name",{
          value:'zhangSan',
      }) // 默认不设置则全部都为false
    console.log(Object.getOwnPropertyDescriptor(person,'name'));
    /*
    *configurable: false
    *enumerable: false
    *value: "zhangSan"
    *writable: false
    * 
    */
    

什么是数据属性?

configurable 若为 false

  1. 无法 使用 delete 删除 对象的属性值

  2. 可以将 writable 值 由 true 变为 false

  ````javascript
   let person={}
  Object.defineProperty(person,"name",{
       value:'zhangSan',
       configurable:false
  })
  delete person.name
  /*
  	TypeError: Cannot delete property 'name' of #<Object>
  */
  ````

  

enumerable

enumerable 若为 false

  1. 无法使用 for in 遍历 对象属性

writable

writable 若为 false

  1. 无法修改属性值
 let person={}
 Object.defineProperty(person,"name",{
      value:'zhangSan',
   	  writable : false
  })
/*
Uncaught TypeError: Cannot assign to read only property 'name' of object '#<Object>'
*/

访问器属性(Configurable、Enumerable、Get、Set)

  1. Configurable为false, 不能使用delete删除属性、不能修改数据属性
  2. Enumerable为false,不能使用for-in访问属性
  3. Get 函数 读取函数值调用
  4. Set 函数 写入函数值调用

读取属性的特性

  • Object.getOwnPropertyDescriptor
    
  • 返回对象 包含数据属性、访问器属性