JS对象属性描述

属性描述符的结构

  在定义对象, 定义属性时, 属性描述符一共有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 方法

 

posted @ 2020-11-12 15:41  申继林  阅读(458)  评论(0编辑  收藏  举报