深入解析:JS逆向JavaScript 对象属性
JavaScript 对象属性
1. 属性的分类
数据属性 (Data Property)
- 保存具体的值(value)。
- 常见场景:
obj.a = 1
访问器属性 (Accessor Property)
不直接保存值,通过 getter 和 setter 控制。
常见场景:
let obj = { get x() { return this._x }, set x(v) { this._x = v } };
2. 属性的特性(描述符)
数据属性的特性
| 特性 | 说明 | 默认值 |
|---|---|---|
| value | 属性的值 | undefined |
| writable | 是否可修改 value | false(如果用 defineProperty 定义) |
| enumerable | 是否可枚举(for…in / Object.keys) | false |
| configurable | 是否可删除、是否能修改描述符 | false |
访问器属性的特性
| 特性 | 说明 | 默认值 |
|---|---|---|
| get | getter 函数 | undefined |
| set | setter 函数 | undefined |
| enumerable | 是否可枚举 | false |
| configurable | 是否可删除、是否能修改描述符 | false |
3. 定义属性的方式
直接赋值(最常见)
let obj = { }; obj.a = 1; // 数据属性writable / enumerable / configurable 默认全是
true对象字面量
let obj = { a: 1, get b() { return this.a * 2; } };Object.definePropertylet obj = { }; Object.defineProperty(obj, "c", { value: 42, writable: false, enumerable: true, configurable: false });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
什么是属性描述符
属性描述符就是 属性的元信息,比如:
valuewritableenumerableconfigurableget/set
这些东西统称为“描述符”。
configurable 控制什么
configurable 就是用来决定 能不能修改描述符本身。
具体来说:
能否删除属性
let obj = { }; Object.defineProperty(obj, "a", { value: 1, configurable: false }); delete obj.a; // ❌ 删除失败能否修改
enumerable、configurable本身let obj = { }; Object.defineProperty(obj, "a", { value: 1, enumerable: true, configurable: false }); Object.defineProperty(obj, "a", { enumerable: false }); // ❌ 报错:因为 configurable = false能否把数据属性改成访问器属性(或反过来)
let obj = { }; Object.defineProperty(obj, "a", { value: 1, configurable: false }); Object.defineProperty(obj, "a", { get() { return 100; } }); // ❌ 报错:不能从 value 属性改成 getter有个例外: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)

浙公网安备 33010602011771号