object.defineproperty()是javascript中精确控制对象属性行为的核心方法,支持数据描述符(value/writable/enumerable/configurable)和存取描述符(get/set),二者不可混用;可定义只读、不可枚举、不可配置属性,或通过get/set实现响应式逻辑。

在 JavaScript 中,Object.defineProperty() 是精确控制对象属性行为的核心方法,适合定义单个属性并细粒度设置其特性(如是否可写、可枚举、可配置等)。
基础语法与必需参数
该方法接收三个参数:目标对象、属性名(字符串)、描述符对象:
Object.defineProperty(obj, 'propertyName', {
value: 'initial value',
writable: true,
enumerable: true,
configurable: true
});
其中 value、writable、enumerable、configurable 构成“数据描述符”;若使用 get/set,则属于“存取描述符”,二者不可混用。
定义只读属性(writable: false)
防止属性值被意外修改:
- 设置
writable: false后,直接赋值无效(严格模式下报错) - 仍可通过
Object.defineProperty修改描述符本身(前提是configurable: true) - 示例:
Object.defineProperty(obj, 'PI', { value: 3.14159, writable: false, enumerable: false, configurable: false });
控制遍历与继承行为(enumerable & configurable)
enumerable: false 让属性不出现在 for...in、Object.keys() 或 JSON 序列化中;configurable: false 则锁定该属性的描述符配置(无法删除、无法改写 writable/enumerable 等)。
- 一旦
configurable: false,后续只能把writable从true改为false,反之不行 - 常用于定义内部状态属性,避免被外部枚举或误删
使用 get/set 实现响应式逻辑
当需要监听属性读写时,用存取描述符替代 value 和 writable:
-
get()在访问属性时触发,应返回值 -
set(newValue)在赋值时触发,可用于验证、派生、通知更新 - 注意:不能同时指定
value或writable,否则抛出 TypeError
例如:Object.defineProperty(obj, 'fullName', { get() { return this.firstName + ' ' + this.lastName; }, set(val) { [this.firstName, this.lastName] = val.split(' '); } });
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











