object.defineproperties 是 javascript 中一次性定义或修改对象多个属性描述符的高效方法,支持数据描述符和存取描述符,适用于初始化配置对象、封装校验逻辑及原型级属性控制。

Object.defineProperties 是 JavaScript 中用于一次性定义或修改对象多个属性描述符的内置方法。它比逐个调用 Object.defineProperty 更高效、更清晰,特别适合初始化配置复杂对象(如类实例、配置对象、响应式数据等)。
基本语法与参数结构
该方法接收两个参数:
- 目标对象(要操作的对象)
- 描述符对象(键为属性名,值为对应的属性描述符)
每个属性描述符可以是数据描述符(含 value、writable、enumerable、configurable)或存取描述符(含 get、set、enumerable、configurable),二者不可混用。
定义不可枚举且不可修改的数据属性
例如创建一个内部状态对象,隐藏关键字段并防止意外修改:
const user = {};
Object.defineProperties(user, {
id: {
value: 1001,
writable: false,
enumerable: false,
configurable: false
},
createdAt: {
value: new Date(),
writable: false,
enumerable: false,
configurable: false
}
});
这样 id 和 createdAt 不会出现在 for...in 或 Object.keys() 中,也无法被重新赋值或删除。
混合使用数据描述符与存取描述符
适合封装带校验或副作用的属性。比如一个带格式校验的邮箱字段:
const profile = {};
Object.defineProperties(profile, {
name: {
value: '',
writable: true,
enumerable: true,
configurable: true
},
email: {
get() {
return this._email || '';
},
set(value) {
if (typeof value === 'string' && /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(value)) {
this._email = value;
} else {
throw new Error('邮箱格式不合法');
}
},
enumerable: true,
configurable: true
}
});
注意:存取描述符中访问 this._email 依赖对象自身存在 _email 属性,通常需提前初始化或配合私有字段策略。
配合 Object.create 实现原型级属性控制
若想让多个实例共享同一套受控属性(如只读常量),可先在原型对象上批量定义,再通过 Object.create 继承:
const BaseConfig = Object.create(null);
Object.defineProperties(BaseConfig, {
API_TIMEOUT: { value: 5000, writable: false, enumerable: true },
ENV: { value: 'production', writable: false, enumerable: true }
});
const myConfig = Object.create(BaseConfig); // 继承但无 constructor 干扰
console.log(myConfig.API_TIMEOUT); // 5000
这种方式避免污染全局或构造函数原型,也利于冻结基础配置。











