属性描述符
什么是属性描述符
属性描述符用于定义或修改对象属性的详细行为,属性描述符为对象的属性提供了额外的配置选项,例如是否可枚举、是否可写、是否可配置等。
属性描述符主要分为:数据描述符和访问器描述符。
要修改属性描述符,必须使用Object.defineProperty()
方法。
数据描述符
数据描述符有四个属性:value、writable、enumerable、configurable。
ts
const person = {};
Object.defineProperty(person, "name", {
value: "John", // 属性实际值,默认 undefined
writable: false, // 属性是否可修改,默认 true
enumerable: true, // 属性是否可通过 for-in 返回,默认 true
configurable: true, // 属性是否可通过 delete 删除,默认 true
});
访问器描述符
访问器描述符有四个属性:get、set、enumerable、configurable。
ts
const book: { [key: string]: string } = {};
Object.defineProperty(book, "bookName", {
get() {
return this._bookName;
},
set(value) {
this._bookName = `《${value}》`;
},
enumerable: true,
configurable: true,
});
book.bookName = "JavaScript 高级程序设计";
console.log(book.bookName); // 《JavaScript 高级程序设计》
定义多个属性
要通过多个描述符一次性定义多个属性,可以使用Object.defineProperties()
方法。
ts
const car = {};
Object.defineProperties(car, {
brand: {
value: "BMW",
writable: false,
enumerable: true,
configurable: true,
},
color: {
get() {
return this._color;
},
set(value) {
this._color = value;
},
enumerable: true,
configurable: true,
},
});
获取属性描述符
要获取对象的属性描述符,可以使用Object.getOwnPropertyDescriptor()
方法。
ts
const propertyDescriptor = Object.getOwnPropertyDescriptor(car, "brand");
console.log(propertyDescriptor);
// { value: 'BMW', writable: false, enumerable: true, configurable: true }
获取所有属性描述符
要获取对象的所有属性描述符,可以使用Object.getOwnPropertyDescriptors()
方法。
ts
const propertyDescriptors = Object.getOwnPropertyDescriptors(car);
console.log(propertyDescriptors);
/**
{
brand: {
value: 'BMW',
writable: false,
enumerable: true,
configurable: true
},
color: {
get: [Function: get],
set: [Function: set],
enumerable: true,
configurable: true
}
}
*/