JS - 对象属性配置

18 阅读1分钟

属性标志

除了 value 之外,每个属性都有三个特殊的属性(有时也称为“标志”):

  • writable —— 如果为 true,则可以修改该属性的值,否则它是只读的
  • enumerable —— 如果为 true,则该属性在循环中被列出,否则不列出
  • configurable —— 如果为 true,则可以使用 delete 删除该属性,否则不可删除,不可配置是一条单行道,改了就改不回来了

创建时默认都为 true,可以通过 Object.getOwnPropertyDescriptor(obj, propertyName) 获取属性标志或 Object.getOwnPropertyDescriptors(obj) 一次获取所有属性描述符。

也可以使用 Object.defineProperty(obj, propertyName, descriptor)来修改属性标志,如果 propertyName 存在则更新,否则使用给定的值和标志创建(该情况下没有提供的标志默认为 false)。

将一个属性 user.name 设置为永不可改的常量:

Object.defineProperty(user, 'name', {
    writable: false,
    configurable: false,
})

“更好”地克隆对象:

let clone = Object.defineProperties({}, Object.getOwnPropertyDescriptors(obj))

访问器属性,getter 和 setter

let user = {
    name: 'John',
    surname: 'Smith',

    get fullName() {
        return `${this.name} ${this.surname}`
    },
    
    set fullName(value) {
        [this.name, this.surname] = value.split(' ')
    }
}