數據屬性描述符#
- value:值
- writable:值是否可改寫
- enumerable:是否可枚舉(
forin
,Object.keys()
) - configurable:是否可配置(
delete
,defineProperty
是否可以設置成功)
注意
屬性描述符在單個屬性的級別上工作。
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