Object.defineProperties 是 JavaScript 中一次性定义或修改多个对象属性的方法,接收目标对象和属性描述符对象两个参数,支持数据属性与访问器属性混合定义,但需注意描述符兼容性、默认值及不可扩展/不可配置属性的限制。

Object.defineProperties 是 JavaScript 中用于一次性定义或修改多个对象属性的内置方法,它比逐个调用 Object.defineProperty 更简洁高效。
基本语法和参数结构
该方法接收两个参数:目标对象和一个属性描述符对象(key 为属性名,value 为对应的属性描述符)。
- 第一个参数是你要操作的对象(会被直接修改)
- 第二个参数是一个对象,其每个键对应目标对象上的属性名,值是该属性的描述符(如
value、writable、enumerable、configurable、get、set)
定义多个数据属性
适合批量设置具有固定值、可读写或只读的属性:
const obj = {};
Object.defineProperties(obj, {
name: { value: 'Alice', writable: false, enumerable: true, configurable: false },
age: { value: 30, writable: true, enumerable: true, configurable: false },
city: { value: 'Beijing', writable: false, enumerable: false, configurable: true }
});
这样定义后:obj.name 不可修改,obj.age 可改,obj.city 不会出现在 for...in 或 Object.keys() 中(因 enumerable: false)。
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
混合定义数据属性和访问器属性
你可以在同一个调用中混用 value/writable 和 get/set,但不能同时指定 value 或 writable 与 get 或 set。
- 数据属性:用
value+writable控制赋值行为 - 访问器属性:用
get和set函数实现逻辑封装
const person = { _name: 'Bob', _age: 25 };
Object.defineProperties(person, {
name: {
get() { return this._name; },
set(val) { this._name = val.trim(); },
enumerable: true,
configurable: true
},
age: {
get() { return this._age; },
set(val) { this._age = Number(val) >= 0 ? Number(val) : 0; },
enumerable: true,
configurable: true
}
});
注意事项和常见陷阱
使用时需注意描述符的兼容性与默认行为:
- 未显式指定的描述符字段会取默认值:
value、writable、get、set默认为undefined;enumerable、configurable默认为false - 如果目标对象不可扩展(
Object.preventExtensions()),新增属性会失败并抛出错误(严格模式下)或静默忽略(非严格模式) - 已存在且
configurable: false的属性,若尝试修改其enumerable或writable等特性,也会报错
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










