数据属性描述符#
- value:值
- writable:值是否可改写
- enumerable:是否可枚举(
forin
,Object.keys()
) - configurable:是否可配置(
delete
,defineProperty
是否可以设置成功)
note
属性描述符在单个属性的级别上工作。
Object.getOwnPropertyDescriptor#
获取数据属性的描述符。
const user = {
name: 'z',
age: 23
}
const config = Object.getOwnPropertyDescriptor(user, 'name')
console.log(config)
// { value: 'z', writable: true, enumerable: true, configurable: true }
Object.defineProperty#
设置数据属性的描述符。
const user = {
name: 'z',
age: 23
}
Object.defineProperty(user, 'name', {
writable: false,
enumerable: false,
configurable: false
})
Object.defineProperties#
一次性设置对象多个数据属性的描述符。
const user = {
name: 'z',
age: 23
}
Object.defineProperties(user, {
name: {
writable: false,
enumerable: false,
configurable: false
},
age:{
writable: false,
enumerable: false,
configurable: false
}
})
Object.getOwnPropertyDescriptors#
一次性获取所有数据属性描述符。
const user = {
name: 'z',
age: 23
}
const config = Object.getOwnPropertyDescriptors(user)
console.log(config)
// {
// name: { value: 'z', writable: true, enumerable: true, configurable: true },
// age: { value: 23, writable: true, enumerable: true, configurable: true }
//}
设定一个全局的密封对象#
Object.seal(obj)#
禁止添加 / 删除属性。为所有现有的属性设置 configurable: false
。
Object.freeze(obj)#
禁止添加 / 删除 / 更改属性。为所有现有的属性设置 configurable: false
, writable: false
。
访问器属性#
本质上是用于获取和设置值的函数,但从外部代码来看就像常规属性。
let obj = {
get propName() {
// 当读取 obj.propName 时,getter 起作用
},
set propName(value) {
// 当执行 obj.propName = value 操作时,setter 起作用
}
};
getter 和 setter#
访问器属性由 “getter” 和 “setter” 方法表示。在对象字面量中,它们用 get
和 set
表示:
let user = {
name: "John",
surname: "Smith",
get fullName() {
return `${this.name} ${this.surname}`;
},
set fullName(value) {
[this.name, this.surname] = value.split(" ");
}
};
// set fullName 将以给定值执行
user.fullName = "Alice Cooper";
console.log(user.fullName) // Alice Cooper
console.log(user.name); // Alice
console.log(user.surname); // Cooper
访问器描述符#
get
: 一个没有参数的函数,在读取属性时工作set
: 一个带有单个参数的函数,当写入属性时工作enumerable
:与数据属性的相同,configurable
: 与数据属性的相同,
let user = {
name: "John",
surname: "Smith"
};
Object.defineProperty(user, 'fullName', {
get() {
return `${this.name} ${this.surname}`;
},
enumerable: true,
set(value) {
[this.name, this.surname] = value.split(" ");
}
});
console.log(user.fullName); // John Smith
for(let key in user) console.log(key); // name, surname, fullName