JavaScript配置属性描述符须用Object.defineProperty()或defineProperties(),数据描述符(value/writable)与访问器描述符(get/set)互斥,未显式设置的布尔字段默认false;数据描述符控制值与写权限,访问器描述符用于计算、校验等逻辑;必须显式声明enumerable和configurable,否则属性“存在但不可见”或无法修改删除;可用getOwnPropertyDescriptor查看、defineProperties批量配置。

JavaScript 中配置对象属性描述符,核心是用 Object.defineProperty() 或 Object.defineProperties(),关键在于正确选择描述符类型并显式设置字段——数据描述符和访问器描述符互斥,不能混用,且未指定的字段默认为 false(不是继承或推断)。
数据描述符:控制值与写权限
适用于普通属性,通过 value 存值、writable 控制是否可修改:
-
value:指定属性的初始值,可以是任意类型(字符串、数字、函数、对象等) -
writable: false时,赋值操作在非严格模式下静默失败,严格模式下抛TypeError -
enumerable: false(默认)→ 不出现在for...in、Object.keys()、JSON.stringify()中 -
configurable: false(默认)→ 无法删除该属性,也不能再次调用defineProperty改变其描述符(包括从数据描述符转为访问器描述符)
示例:
const obj = {};
Object.defineProperty(obj, 'id', {
value: 1001,
writable: false,
enumerable: true,
configurable: true
});
访问器描述符:用 get/set 拦截读写逻辑
适合需要计算、校验、副作用或封装私有状态的场景,不设 value 和 writable:
立即学习“Java免费学习笔记(深入)”;
-
get函数无参数,返回值即为属性读取结果;若未定义,读取返回undefined -
set函数接收一个参数(新值),可用于验证、转换或触发更新 - 同样支持
enumerable和configurable,作用与数据描述符一致 - 注意:
get和set至少定义一个,否则描述符无效
示例:
const obj = { _price: 99 };
Object.defineProperty(obj, 'price', {
get() { return this._price; },
set(val) { if (val > 0) this._price = val; },
enumerable: true,
configurable: true
});
必须显式声明,避免默认陷阱
直接用字面量创建的对象(如 {a: 1}),其属性默认 writable: true、enumerable: true、configurable: true;但用 defineProperty 新增的属性,所有布尔型描述符默认都是 false:
- 漏写
enumerable: true→ 属性“存在但不可见”,调试时容易误判为未定义 - 漏写
configurable: true→ 后续无法修改或删除该属性,Vue 2 响应式初始化就依赖此行为 - 不能同时出现
value和get—— 浏览器会直接报错TypeError: Invalid property descriptor
查看和批量配置描述符
用 Object.getOwnPropertyDescriptor(obj, key) 查看已有属性的完整描述符,确认当前状态;用 Object.defineProperties(obj, descriptors) 一次性配置多个属性,避免重复调用:
const user = {};
Object.defineProperties(user, {
name: { value: 'Tom', writable: false, enumerable: true },
age: { get() { return this._age || 0; }, set(v) { this._age = Math.max(0, v); } }
});


















