Object.defineProperties可一次性定义多个属性并配置getter等描述符;需传入属性名到描述符对象的映射,描述符中含get函数则自动设value为undefined且writable为false。

可以使用 Object.defineProperties 一次性为对象定义多个属性,其中每个属性都能独立配置 get(getter)、set(setter)、enumerable、configurable 等描述符。关键在于:**传入一个属性描述符对象,其键是属性名,值是对应的属性描述符(含 get 函数)**。
语法结构要清晰
函数签名是:
Object.defineProperties(obj, descriptors)
其中 descriptors 是一个普通对象,形如:
- 键名:要定义的属性名(字符串)
-
键值:该属性的描述符对象,必须包含
get或value(不能同时有),若含get,则自动设为value: undefined且writable: false
定义带 getter 的多个计算属性
例如,给用户对象添加只读的全名、年龄、是否成年等动态字段:
const user = {
firstName: '张',
lastName: '三',
birthYear: 1995
};
<p>Object.defineProperties(user, {
fullName: {
get() {
return <code>${this.firstName} ${this.lastName}</code>;
},
enumerable: true,
configurable: true
},
age: {
get() {
return new Date().getFullYear() - this.birthYear;
},
enumerable: true
},
isAdult: {
get() {
return this.age >= 18;
}
}
});此时访问 user.fullName 或 user.isAdult 会实时执行对应 getter 函数。
注意不可枚举与不可配置的默认行为
如果不显式设置:
-
enumerable默认为false→ 属性不会出现在for...in或Object.keys()中 -
configurable默认为false→ 后续无法用delete删除,也无法再次用defineProperty修改描述符(除非设为true) -
set可选;若只写get,该属性默认只读(尝试赋值无效,严格模式下报错)
配合 this 绑定与闭包实现私有逻辑
getter 内部的 this 指向调用时的对象(即 user),因此可安全访问其他自有属性。若需封装私有状态,可用闭包包裹:
const createPerson = (firstName, lastName) => {
const _firstName = firstName;
const _lastName = lastName;
<p>const person = {};
Object.defineProperties(person, {
fullName: {
get() {
return <code>${_firstName} ${_lastName}</code>;
}
}
});
return person;
};这样 _firstName 不暴露在对象上,仅通过 getter 访问。

















