Object.defineProperty 是 JavaScript 中用于精确控制单个对象属性行为的核心方法,通过 descriptor 配置可读、可写、可枚举、可删除及监听能力,支持数据描述符(value/writable)和存取描述符(get/set),不支持批量或递归操作。

Object.defineProperty 是 JavaScript 中精确控制对象属性行为的核心方法,不是简单赋值的替代品,而是用来定义或修改单个属性的“精细开关”。它不批量操作,也不自动递归,但能决定一个属性是否可读、可写、可枚举、可删除,甚至能否被监听变化。
基本语法与参数含义
调用形式固定为:
Object.defineProperty(obj, prop, descriptor)- obj:目标对象,即你要操作属性的那个对象
- prop:字符串或 Symbol 类型的属性名(不能是数字或表达式)
- descriptor:描述符对象,包含该属性的具体行为配置
两类描述符:数据型 vs 存取型
描述符必须严格属于其中一类,不可混用(比如不能同时写 value 和 get):
-
数据描述符:用于普通值属性,关键字段是
value和writable;默认writable、enumerable、configurable全为false -
存取描述符:用于带逻辑的属性,靠
get和set函数控制读写;get无参,返回值即属性值;set接收一个参数,代表新值
四个核心特性详解
无论哪类描述符,都可能包含以下通用配置项(不写则取默认值):
立即学习“Java免费学习笔记(深入)”;
-
configurable:设为
false后,该属性不能再被delete删除,也不能再用Object.defineProperty修改其描述符(包括改回true) -
enumerable:决定该属性是否出现在
for...in、Object.keys()、JSON.stringify()等枚举场景中 -
writable(仅数据描述符):控制是否允许用
=直接赋值修改value - value(仅数据描述符)或 get/set(仅存取描述符):二者必居其一,不可共存
常见误点与实用建议
新手容易忽略的细节:
- 直接用
obj.prop = xxx添加的属性,默认三项特性全为true;而Object.defineProperty默认全为false,务必显式设置需要的行为 - 数组索引(如
'0')或动态新增属性(如obj.newKey = 1)无法被 Vue 2 响应式系统自动侦测,正是因Object.defineProperty不监听这些变化 - 若要批量处理对象所有属性,需配合
Object.keys()或Reflect.ownKeys()循环调用,它本身不支持通配符或嵌套遍历 - 在严格模式下,对
writable: false的属性赋值会抛TypeError;非严格模式下则静默失败


















