属性描述符的结构
在定义对象, 定义属性时, 属性描述符一共有6个
- value: 设置属性的值, 默认值为undefined
- writable: 设置属性值是否可写, 默认值为true
- enumerable: 设置属性是否可枚举, 即是否允许使用 for/in 语句或 Object.keys() 函数遍历访问, 默认值 true
- configurable: 设置是否可设置属性特性, 默认为true, 如果为false, 将无法删除属性, 不能够修改属性值, 也不能修改属性的属性的描述符的值
- get: 取值函数, 默认为undefined
- set: 存值函数, 默认为undefined
get和set函数
var obj = { _x : 1, //定义_x属性 get x() { return this._x }, //定义x属性的getter set x(value) { //定义x属性的setter if (typeof value != "number") throw new Error('请输入数字'); this._x = value; //赋值 } }; console.log(obj.x); //1 obj.x = 2; console.log(obj.x); //2
操作属性描述符
属性描述符是一个内部对象, 无法直接读写, 可以通过下面几个函数进行操作
- Object.getOwnPropertyDescriptor(): 可以读出指定对象私有属性的属性描述符
- Object.defineProperty(): 通过定义属性描述符来定义或修改一个属性, 然后返回修改后的描述符
- Object.defineProperties(): 可以同时定义多个属性描述符
- Object.getOwnPropertyNames(): 获取对象的所有私有属性
- Object.keys(): 获取对象的所有本地可枚举的属性
- propertyIsEnumerable(): 对象实例方法, 直接调用, 判断指定的属性是否可枚举
控制对象状态
- Object.preventExtensions: 阻止为对象添加新的属性
- Object.seal: 阻止为对象添加新的属性, 同事也无法删除就属性. 等价于属性描述符的 configurable 属性设为false, 该方法不影响修改某个属性的值
- Object.freeze: 阻止为一个对象添加新属性, 删除就属性, 修改属性值
- Object.isExtensible: 检查一个对象是否允许添加新的属性
- Object.isFrozen: 检查一个对象是否使用了Object.freeze 方法