0%

JavaScript属性对象增强

对象属性操作的控制

  • Object.defineProperty可以对对象的属性加以限制,例如不能通过delete删除,不能通过for-in/Object.keys遍历
  • Object.defineProperty方法会直接在一个对象上定义一个新的属性,或者修改一个对象的现有属性,并返回该对象

Object.defineProperty参数:Object.defineProperty(obj, prop, descriptor)

  • obj:要定义的对象
  • prop:要定义或修改的属性的名称或Symbol
  • descriptor:要定义或修改的属性描述符

属性描述符分类

image-20230327092658898

Configuratble:属性是否可以通过delete删除属性,是否可以修改它的特性,或者是否可以将它修改为存取属性描述符

  • 通过对象定义某个属性,其Configurable为true
  • 通过属性描述符定义属性时,属性的Configurable默认为false

Enumerable:属性是否可以通过for-in或者Object.keys()返回属性

  • 通过对象定义时,属性的Enumerable为true
  • 通过属性描述符定义属性时,属性的Enumerable默认为false

Writable:属性是否可以修改值

  • 通过对象定义时,属性的Writable为true
  • 通过属性描述符定义属性时,属性的Writable默认为false

value:属性的value值,读取属性会返回该值,修改属性时,会对其进行更改

  • 默认情况下这个值是undefined

get:获取属性时会执行的函数,默认为undefined

set:设置属性时会执行的函数,默认为undefined

注:get/set与value/Writable不可共存

补充:

同时定义多个属性:Object.defineProperties()

image-20230327093656890

获取对象的属性描述符:

  • getOwnPropertyDescriptor
  • getOwnPropertyDescriptors

禁止对象扩充新属性:preventExtensions Object.preventExtensions(obj)

  • 给一个对象添加新的属性会失败

密封属性,不允许配置和删除属性:seal Object.seal(obj)

  • 实际上是调用preventExtensions
  • 将现有属性的Configurable设置为false

冻结属性,不允许修改现有属性:freeze Object.freeze(obj)

实际上是调用seal

将现有属性的Writable设置为false