Object.defineProperties 是 JavaScript 中批量定义或修改对象多个属性的高效方法,接收目标对象和描述符对象两个参数,支持数据属性(value/writable等)和访问器属性(get/set),且二者不可混用。

Object.defineProperties 是 JavaScript 中用于一次性为对象定义或修改多个属性的内置方法,它比逐个调用 Object.defineProperty 更高效、更简洁。
基本语法和参数结构
该方法接收两个参数:目标对象和一个描述符对象(key 为属性名,value 为对应的属性描述符)。
- 第一个参数是你要操作的对象(可以是空对象,也可以是已有对象)
- 第二个参数是一个对象,它的每个键对应目标对象上的属性名,值是该属性的描述符(即 configurable、enumerable、writable、value、get、set 等配置项)
定义数据属性(带值和可写性控制)
适合批量添加普通属性,并精确控制是否可枚举、可修改、可删除。
const obj = {};
Object.defineProperties(obj, {
name: {
value: 'Alice',
writable: false,
enumerable: true,
configurable: false
},
age: {
value: 30,
writable: true,
enumerable: true,
configurable: true
}
});
// obj.name = 'Bob'; // 无效,writable 为 false
// console.log(obj); // { name: 'Alice', age: 30 }
定义访问器属性(getter/setter)
当需要属性有计算逻辑或副作用时,用 get 和 set 描述符。注意:不能同时指定 value/writable 和 get/set。
立即学习“Java免费学习笔记(深入)”;
- get 函数无参数,返回值作为属性读取结果
- set 函数接收一个参数(赋值时传入的值),不强制要求返回值
- 访问器属性默认 configurable 和 enumerable 都为 false,需显式设置才可枚举或删除
const person = { _salary: 5000 };
Object.defineProperties(person, {
salary: {
get() {
return this._salary;
},
set(value) {
if (value < 0) throw new Error('Salary cannot be negative');
this._salary = value;
},
enumerable: true,
configurable: true
}
});
常见注意事项
使用时容易忽略的关键点:
- 如果目标对象已有同名属性,且该属性不可配置(configurable: false),则无法通过 defineProperties 修改其描述符(会抛出 TypeError)
- 所有描述符字段都是可选的,但至少要提供 value/get 或 set;否则属性值为 undefined,且不可写
- 描述符中未明确设置的字段(如 enumerable)默认为 false,不是继承自 Object.prototype 的默认行为
- defineProperties 不会触发 setter,只在定义阶段生效;后续读写由 get/set 控制


















