温故而知新:Javascript对象的属性类型

137 阅读1分钟

前言

在JavaScript中对象是我们经常用到的,它包括各种属性和方法,而对象的属性有两种类型:数据属性和访问器属性

对象属性

对象的一个属性要么是数据属性,要么是访问器属性,不能两者都存在,否则被抛出错误

let obj = {}
Object.defineProperty(obj, 'name', {
    value: 'hello world',
    get() { 
        return 'hi world'
    }
})
console.log(obj.name)

数据属性和访问器属性的特性是为了实现JavaScript引擎用的,因此不能直接在JavaScript中进行访问

数据属性

let obj = {
   name: 'hello world' // name就是数据属性 
}
let obj = new Object()
obj.name = 'hello world' // name就是数据属性

Obj.defineProperty(obj, 'name', {
    value: 'hello world' // name就是数据属性
})

对于数据属性有四个描述其行为的特性:

  • value:表示这个属性的值,读取属性值的时候,从这个位置读取,写入属性值的时候,把新值保存在这个位置,默认值为undefined
  • configurable:表示能否通过delete删除这个属性
  • enumerable:表示能否通过for...in属性返回属性
  • writable:表示能否修改属性的值

通过new Object()或对象字面量方式创建对象后添加的属性,configurable,enumerable,writable特性值都为true,通过Object.defineProperty()定义的属性,默认值都为false

访问器属性

访问器属性不能直接定义,必须通过Object.defineProperty()来进行定义

let obj = {}
Object.defineProperty(obj, 'name', {
    configurable: true,
    enumerable: true,
    get() {
        return 'hello world'
    },
    set(val) {
      console.log('设置了值')
    }
})

访问器属性有四个描述其行为的特性:

  • configurable:表示能否通过delete进行删除
  • enumerable:表示能否通过for...in进行循环属性
  • get:在读取属性时调用的函数
  • set:在写入属性时调用的函数