object.defineproperties()是javascript中批量定义或修改对象属性的静态方法,接收目标对象和描述符对象两个参数,支持数据描述符(value/writable)与存取描述符(get/set),常用于创建只读配置、响应式逻辑及私有属性封装。

Object.defineProperties() 是 JavaScript 中用于一次性定义或修改多个对象属性的静态方法,比逐个调用 Object.defineProperty() 更简洁高效。
基本语法与参数结构
该方法接收两个参数:
- 目标对象(要操作的对象)
- 描述符对象(键为属性名,值为对应的属性描述符)
示例:
Object.defineProperties(obj, {
name: { value: 'Alice', writable: false, enumerable: true },
age: { value: 30, writable: true, configurable: false },
toString: {
value: function() { return `${this.name} (${this.age})`; },
enumerable: false,
writable: true
}
});
属性描述符的类型区分
每个属性描述符必须是“数据描述符”或“存取描述符”之一,不能混用:
-
数据描述符:含
value和writable(如普通值属性) -
存取描述符:含
get和/或set(如计算属性或拦截访问)
注意:configurable 和 enumerable 在两类中都可共用。
常见使用场景
- 创建不可枚举、只读的配置对象(如常量集合)
- 批量冻结部分属性,同时保留其他属性可写
- 为已有对象添加 getter/setter,实现响应式逻辑雏形(如简易数据绑定)
- 封装私有属性模拟(配合闭包或 Symbol,再用 defineProperties 暴露受控接口)
注意事项与陷阱
- 若目标对象不可扩展(
Object.preventExtensions()),新增属性会静默失败(非严格模式)或抛错(严格模式) - 已存在属性若
configurable: false,则不能修改其描述符类型(比如从数据描述符改为存取描述符) - 所有属性默认
configurable、enumerable、writable均为false,不显式声明即不可改、不可遍历、不可赋值
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











