登录
首页 >  文章 >  前端

如何利用 Object.defineProperties 一次性为对象配置带 Getter 的复合描述

时间:2026-05-05 14:36:44 107浏览 收藏

本篇文章向大家介绍《如何利用 Object.defineProperties 一次性为对象配置带 Getter 的复合描述》,主要包括,具有一定的参考价值,需要的朋友可以参考一下。

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

如何利用 Object.defineProperties 一次性为对象配置带 Getter 的复合描述

可以使用 Object.defineProperties 一次性为对象定义多个属性,其中每个属性都能独立配置 get(getter)、set(setter)、enumerableconfigurable 等描述符。关键在于:**传入一个属性描述符对象,其键是属性名,值是对应的属性描述符(含 get 函数)**。

语法结构要清晰

函数签名是:

Object.defineProperties(obj, descriptors)

其中 descriptors 是一个普通对象,形如:

  • 键名:要定义的属性名(字符串)
  • 键值:该属性的描述符对象,必须包含 getvalue(不能同时有),若含 get,则自动设为 value: undefinedwritable: 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;
}
}
});</p>

此时访问 user.fullNameuser.isAdult 会实时执行对应 getter 函数。

注意不可枚举与不可配置的默认行为

如果不显式设置:

  • enumerable 默认为 false → 属性不会出现在 for...inObject.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;
};</p>

这样 _firstName 不暴露在对象上,仅通过 getter 访问。

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《如何利用 Object.defineProperties 一次性为对象配置带 Getter 的复合描述》文章吧,也可关注golang学习网公众号了解相关技术文章。

资料下载
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>