JavaScript 对象

75 阅读2分钟

创建对象

  • 生成实例来创建一个对象
let obj = new Object()
obj.name = 'shanhe'
obj.eat = function () {
  console.log('chifan')
}
  • 字面量方式创建新对象
let obj = {
  name: 'shanhe',
  eat: function () {
    console
  },
}

属性类型

数据属性

  • Configurable

    • 通过 delete 删除属性从而重新定义属性

    • 修改属性的特性

    • 把属性改为访问器属性

    • 直接在对象上定义的属性

    • 默认值是true

  • Enumerable

    • 通过 for-in 循环返回属性

    • 能够直接在对象上定义的属性

    • 默认值是true

  • Writable

    • 修改属性的值

    • 直接在对象上定义的属性

    • 默认值是true

  • Value

    • 属性的值:这里读取属性,写入时新值保存在这里

    • 默认是Undefined

  • Object.defineProperty:修改属性的默认特性

  • 描述符对象的属性必须是configurable、enumerable、writable、value

访问器属性:只能用 Object.defineProperty() 来间接定义

  • Configurable

    • 通过 detele 删除属性从而重新定义属性

    • 修改属性的特性

    • 把属性修改为数据属性

    • 对于直接在对象上定义的属性,默认值是 true

  • Enumerable

    • 通过 for-in 循环返回属性列表

    • 对于直接在对象上定义的属性,默认值是 true

  • Get

    • 在读取属性时调用的函数,默认值是 Undefined
  • Set

    • 在写入属性时调用的函数,默认值是 Undefined
  • 举例

    let book = {
      _year: 2023,
      edition: 1,
    }
    Object.defineProperty(book, 'year', {
      get: function () {
        return this._year
      },
      set: function () {
        if (newValue > 2023) {
          this._year = newValue
          this.edition += newValue - 2023
        }
      },
    })
    book.year=2024
    alert(book.edition) // 2
    
    • _year 前面的下划线表示只能通过对象方法访问的属性

    • 设置一个属性的值会导致其他属性发生变化

    • 只指定 getter 意味属性不能写,严格模式下写入会报错,非严格下忽略

    • 只指定了 setter 函数属性不能读,严格模式下会报错,非严格下返回Undefined

读取属性特性:Object.getOwnPropertyDescriptor( 属性所在对象,读取描述符的属性名称)

  • 返回值是一个对象

    • 访问器属性,configurable、enumerable、get、set

    • 数据属性,confiurable、enmuerable、writable、value

let obj = {}
obj.name = 22
Object.getOwnPropertyDescriptor(obj, 'name')
// {value:22,writable:true,enumrable:true,configurable:true}