object.defineproperties 是 javascript 中一次性定义或修改多个对象属性的方法,比 object.defineproperty 更简洁高效;它接收目标对象和属性描述符对象,支持数据属性与访问器属性,可精确控制 enumerable、writable、configurable 等特性,适用于常量定义、配置封装等场景。

Object.defineProperties 是 JavaScript 中用于一次性定义或修改多个对象属性的内置方法,它比逐个调用 Object.defineProperty 更简洁高效。
基本用法:传入目标对象和属性描述符对象
该方法接收两个参数:第一个是待操作的目标对象,第二个是一个键值对形式的属性描述符对象,每个键对应目标对象上的属性名,值则是该属性的描述符(即 configurable、enumerable、writable、value 或 get/set 等)。
- 描述符中若包含
value或writable,则为数据属性;若含get或set,则为访问器属性 - 所有属性默认都是不可枚举、不可配置、不可写的,除非显式设置
- 不能混用数据属性和访问器属性(比如同时指定
value和get)
常见场景:批量添加只读、不可枚举的常量属性
适合在创建配置对象、常量集合或封装私有字段时使用。例如:
const obj = {};
Object.defineProperties(obj, {
PI: { value: 3.14159, writable: false, enumerable: false, configurable: false },
MAX_RETRY: { value: 3, writable: false, enumerable: true, configurable: false }
});
这样定义后,PI 不可被修改、遍历或删除,MAX_RETRY 可被 for...in 遍历但依然不可改写。
注意陷阱:避免意外覆盖已有属性
如果目标对象已有同名属性,defineProperties 会按描述符重新定义它,可能改变其可枚举性、可配置性等特性,甚至把原本可写的属性变成只读。
- 建议先检查属性是否存在,或使用
Object.getOwnPropertyDescriptors()获取当前状态再合并修改 - 若只是想安全地添加新属性,可先用
Object.keys()过滤已存在属性 - 对原型链上的属性无效,它只操作对象自身属性
与 Object.assign 的关键区别
Object.assign 只能复制可枚举的自有属性,且不控制属性特性(如 writable 或 configurable);而 defineProperties 能精确控制每个属性的行为,包括不可枚举、不可删除、getter/setter 等高级特性。
- 赋值操作(
=)只能触发set访问器,无法触发数据属性的writable: false保护(严格模式下会报错,非严格模式静默失败) - 需要强约束时选 defineProperties,仅需简单合并值时用
assign
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











