Skip to content

属性描述符

什么是属性描述符

属性描述符用于定义或修改对象属性的详细行为,属性描述符为对象的属性提供了额外的配置选项,例如是否可枚举、是否可写、是否可配置等。

属性描述符主要分为:数据描述符访问器描述符

要修改属性描述符,必须使用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
  }
}
 */