属性标志
除了 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(' ')
}
}