对象属性操作的控制
- Object.defineProperty可以对对象的属性加以限制,例如不能通过delete删除,不能通过for-in/Object.keys遍历
- Object.defineProperty方法会直接在一个对象上定义一个新的属性,或者修改一个对象的现有属性,并返回该对象
Object.defineProperty参数:Object.defineProperty(obj, prop, descriptor)
- obj:要定义的对象
- prop:要定义或修改的属性的名称或Symbol
- descriptor:要定义或修改的属性描述符
属性描述符分类
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()
获取对象的属性描述符:
- getOwnPropertyDescriptor
- getOwnPropertyDescriptors
禁止对象扩充新属性:preventExtensions Object.preventExtensions(obj)
- 给一个对象添加新的属性会失败
密封属性,不允许配置和删除属性:seal Object.seal(obj)
- 实际上是调用preventExtensions
- 将现有属性的Configurable设置为false
冻结属性,不允许修改现有属性:freeze Object.freeze(obj)
实际上是调用seal
将现有属性的Writable设置为false