深入解析:JS逆向JavaScript 对象属性

JavaScript 对象属性

1. 属性的分类

  • 数据属性 (Data Property)

    • 保存具体的值(value)。
    • 常见场景:obj.a = 1
  • 访问器属性 (Accessor Property)

    • 不直接保存值,通过 gettersetter 控制。

    • 常见场景:

      let obj = {
      get x() {
      return this._x
      },
      set x(v) {
      this._x = v
      }
      };

2. 属性的特性(描述符)

数据属性的特性

特性说明默认值
value属性的值undefined
writable是否可修改 valuefalse(如果用 defineProperty 定义)
enumerable是否可枚举(for…in / Object.keys)false
configurable是否可删除、是否能修改描述符false

访问器属性的特性

特性说明默认值
getgetter 函数undefined
setsetter 函数undefined
enumerable是否可枚举false
configurable是否可删除、是否能修改描述符false

3. 定义属性的方式

  1. 直接赋值(最常见)

    let obj = {
    };
    obj.a = 1;
    // 数据属性

    writable / enumerable / configurable 默认全是 true

  2. 对象字面量

    let obj = {
    a: 1,
    get b() {
    return this.a * 2;
    }
    };
  3. Object.defineProperty

    let obj = {
    };
    Object.defineProperty(obj, "c", {
    value: 42,
    writable: false,
    enumerable: true,
    configurable: false
    });
  4. Object.defineProperties(批量定义)

    Object.defineProperties(obj, {
    d: { value: 10, writable: true
    },
    e: {
    get() {
    return this.d * 2;
    }
    }
    });

4. 查看属性定义

  • 单个属性描述符

    Object.getOwnPropertyDescriptor(obj, "c");
  • 所有属性描述符

    Object.getOwnPropertyDescriptors(obj);

✅ 总结

  • 直接赋值/字面量 → 默认是 可写、可枚举、可配置 的数据属性
  • defineProperty → 默认是 不可写、不可枚举、不可配置(除非你显式指定)
  • 访问器属性 → 用 getter/setter 代替 value

什么是属性描述符

属性描述符就是 属性的元信息,比如:

  • value
  • writable
  • enumerable
  • configurable
  • get / set

这些东西统称为“描述符”。

configurable 控制什么

configurable 就是用来决定 能不能修改描述符本身

具体来说:

  1. 能否删除属性

    let obj = {
    };
    Object.defineProperty(obj, "a", {
    value: 1,
    configurable: false
    });
    delete obj.a;
    // ❌ 删除失败
  2. 能否修改 enumerableconfigurable 本身

    let obj = {
    };
    Object.defineProperty(obj, "a", {
    value: 1,
    enumerable: true,
    configurable: false
    });
    Object.defineProperty(obj, "a", { enumerable: false
    });
    // ❌ 报错:因为 configurable = false
  3. 能否把数据属性改成访问器属性(或反过来)

    let obj = {
    };
    Object.defineProperty(obj, "a", {
    value: 1,
    configurable: false
    });
    Object.defineProperty(obj, "a", {
    get() {
    return 100;
    }
    });
    // ❌ 报错:不能从 value 属性改成 getter
  4. 有个例外:writable 从 true 改为 false 是允许的

    let obj = {
    };
    Object.defineProperty(obj, "a", {
    value: 1,
    writable: true,
    configurable: false
    });
    Object.defineProperty(obj, "a", { writable: false
    });
    // ✅ 可以
    Object.defineProperty(obj, "a", { writable: true
    });
    // ❌ 不行

总结口诀

  • configurable: true → 你随便改描述符,也能删属性。
  • configurable: false → 属性“锁死”,描述符几乎不能动(除了 writable: true → false
posted @ 2025-09-08 12:58  yfceshi  阅读(11)  评论(0)    收藏  举报