object.defineproperty 是 javascript 中用于精确定义或修改对象单个属性特性的核心方法,支持数据描述符(value/writable)和存取描述符(get/set),需注意二者不可混用,且 configurable、enumerable、writable 默认为 false。

Object.defineProperty 是 JavaScript 中用于精确定义或修改对象**单个属性**特性的核心方法。它不批量操作,而是聚焦于一个属性的 可读性、可写性、可枚举性、可配置性,还能定义 getter/setter 实现响应式逻辑或数据拦截。
基础用法:定义一个普通属性
语法:Object.defineProperty(obj, prop, descriptor),其中 descriptor 是描述符对象。
- obj:目标对象
- prop:要定义或修改的属性名(字符串或 Symbol)
-
descriptor:属性描述符,分两类:
-
数据描述符:含
value和writable(如普通变量) -
存取描述符:含
get和set(如计算属性或副作用控制)
-
数据描述符:含
注意:数据描述符和存取描述符不能混用;必须至少包含 value/writable 或 get/set 之一。
控制属性行为的关键选项
所有描述符字段默认为 false(除 value 默认为 undefined),显式设置才生效:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
enumerable: true→ 属性出现在for...in循环和Object.keys()中 -
configurable: false→ 无法删除该属性,也无法再调用defineProperty修改其描述符(value和writable在configurable: true时仍可改) -
writable: false→obj.prop = xxx被忽略(非严格模式)或报错(严格模式) -
value与writable配合使用;get/set与configurable、enumerable配合使用
用 getter/setter 实现响应式监听
这是 Vue 2 响应式原理的基础。通过 setter 拦截赋值,触发更新逻辑:
let _price = 100;
const product = {};
Object.defineProperty(product, 'price', {
get() {
console.log('读取 price');
return _price;
},
set(newVal) {
console.log('price 被设为', newVal);
_price = newVal;
// 这里可通知视图更新
},
enumerable: true,
configurable: true
});
⚠️ 注意:不能直接在 set 中给 this.price 赋值(会无限递归),需用私有变量或 WeakMap 存储实际值。
常见陷阱与注意事项
- 只能定义**自有属性**,不能用于原型链上的属性
- 对已存在属性重定义时,
configurable: false后不能再改(包括变回true) - 若对象本身是
Object.freeze()或Object.seal(),则无法添加新属性或修改configurable - 在类中定义实例属性时,通常应在构造函数内使用,避免在原型上误改
不复杂但容易忽略细节,关键是理解每个描述符字段的实际作用边界。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










