Object.defineProperties 详解

Object.defineProperties 是 JavaScript 中用于在一个对象上定义或修改多个属性的方法。它是 Object.defineProperty 的复数版本,允许你一次性定义多个属性。

基本语法

Object.defineProperties(obj, props)
  • obj:要在其上定义或修改属性的对象
  • props:一个对象,其键表示要定义或修改的属性名,值是对应属性的描述符对象

属性描述符

每个属性描述符可以包含以下可选键:

数据描述符

  • value:属性的值(默认为 undefined
  • writable:是否可写(默认为 false
  • enumerable:是否可枚举(默认为 false
  • configurable:是否可配置(默认为 false

存取描述符

  • get:作为该属性的 getter 函数(默认为 undefined
  • set:作为该属性的 setter 函数(默认为 undefined

注意:数据描述符和存取描述符不能同时使用(即不能既有 value 又有 get

使用示例

1. 定义多个数据属性

const obj = {};Object.defineProperties(obj, {property1: {value: true,writable: true},property2: {value: 'Hello',writable: false}
});console.log(obj.property1); // true
console.log(obj.property2); // 'Hello'

2. 定义存取器属性

const person = {};
let ageValue = 0;Object.defineProperties(person, {name: {value: 'John',writable: true},age: {get: function() {return ageValue;},set: function(newValue) {if (newValue >= 0) {ageValue = newValue;}},enumerable: true}
});person.age = 30;
console.log(person.age); // 30
person.age = -5;        // 不会设置,因为值无效
console.log(person.age); // 仍然 30

3. 控制属性特性

const car = {};Object.defineProperties(car, {brand: {value: 'Toyota',writable: false,    // 不可写enumerable: true,   // 可枚举configurable: false // 不可配置},model: {value: 'Camry',writable: true,enumerable: false,  // 不可枚举configurable: true}
});console.log(Object.keys(car)); // ['brand'] - model不可枚举
car.brand = 'Honda'; // 静默失败(严格模式下会报错)
console.log(car.brand); // 'Toyota'

Object.defineProperty 的区别

特性Object.definePropertyObject.defineProperties
一次性能定义的属性数1个多个
性能略快略慢(但批量操作更高效)
使用场景单个属性操作多个属性批量操作

实际应用场景

1. 创建不可变对象

const constants = {};Object.defineProperties(constants, {PI: {value: 3.14159,writable: false,enumerable: true,configurable: false},E: {value: 2.71828,writable: false,enumerable: true,configurable: false}
});

2. 实现私有变量

function Person(name) {let _age = 0;Object.defineProperties(this, {name: {value: name,writable: true},age: {get: function() { return _age; },set: function(value) {if (value >= 0) _age = value;},enumerable: true}});
}const p = new Person('Alice');
p.age = 30;
console.log(p.age); // 30
p.age = -5;        // 无效
console.log(p.age); // 仍然 30

3. 扩展对象功能

// 安全地扩展原型(避免枚举)
Object.defineProperties(Array.prototype, {sum: {value: function() {return this.reduce((a, b) => a + b, 0);},enumerable: false},average: {value: function() {return this.length ? this.sum() / this.length : 0;},enumerable: false}
});const nums = [1, 2, 3];
console.log(nums.sum());    // 6
console.log(nums.average()); // 2

注意事项

  1. 默认值:如果不指定,writable, enumerableconfigurable 默认为 false
  2. 严格模式:在严格模式下,违反属性描述符限制会抛出错误
  3. 性能:频繁使用会影响性能,适合初始化时使用
  4. 兼容性:ES5 特性,但现代浏览器和Node.js都支持

Object.defineProperties 提供了对对象属性更精细的控制能力,特别适合需要精确控制属性行为的场景。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/913645.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/913645.shtml
英文地址,请注明出处:http://en.pswp.cn/news/913645.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MyBatis-Plus:深入探索与最佳实践

MyBatis-Plus作为MyBatis的增强版,已经在Java开发中得到了广泛应用。它不仅继承了MyBatis的所有功能,还提供了许多强大的扩展功能,帮助开发者提升开发效率和代码质量。本文将深入探讨MyBatis-Plus的高级特性及其在实际项目中的最佳实践。一、…

劳斯莱斯数字孪生技术:重构航空发动机运维的绿色革命

在航空工业迈向智能化的浪潮中,劳斯莱斯以数字孪生技术为核心,构建了发动机全生命周期管理的创新范式。这项技术不仅重新定义了航空发动机的维护策略,更通过数据驱动的决策体系,实现了运营效率与生态效益的双重突破。本文将从技术…

NPM组件 querypilot 等窃取主机敏感信息

【高危】NPM组件 querypilot 等窃取主机敏感信息 漏洞描述 当用户安装受影响版本的 querypilot 等NPM组件包时会窃取用户的主机名、用户名、工作目录、IP地址等信息并发送到攻击者可控的服务器地址。 MPS编号MPS-2kgq-v17b处置建议强烈建议修复发现时间2025-07-05投毒仓库np…

创业商业融资计划书PPT模版

创业商业融资计划书PPT模版:https://pan.quark.cn/s/25a043e4339e

解决GitHub仓库推送子文件夹后打不开的问题

从你描述的情况来看,IELTS_AI_Assessment 很可能被识别为了 Git 子模块(submodule),而不是普通文件夹,这会导致在 GitHub 上无法直接打开查看内容。以下是具体原因和解决办法:为什么文件夹无法打开&#xf…

Web后端开发-请求响应

文章目录概述请求Postman简单参数原始方式SpringBootRequestParam注解小结实体参数数组集合参数日期参数Json参数路径参数总结响应响应-案例概述 请求 Postman 简单参数 原始方式 // 1. 简单参数 // 原始方式RequestMapping("/simpleParam")public String …

Javascript基础内容回顾—变量提升、事件循环和闭包等内容

以下是前端面试中 JavaScript 基础易错问题的详解,结合常见考点和易混淆概念进行解析: ⚠️ 一、变量作用域与提升 var vs let/const ◦ 变量提升:var 声明的变量会提升到作用域顶部(值为 undefined),而 …

UNIX程序设计基本概念和术语

unix体系结构从严格意义上说,可将操作系统定义为一种软件,它控制计算机硬件资源,提供程序运行环境。我们通常将这种软件称为内核(kernel),因为它相对较小,而且位于环境的核心。内核的接口被称为…

【WEB】Polar靶场 16-20题 详细笔记

目录 十六.签到题 十七.签到 十八.session文件包含 PHP 伪协议(PHP Stream Wrappers) base64加解密获取源代码 Session文件包含 namenameShell 是什么? 十九.Dont touch me 二十.robots robots.txt 十六.签到题 把didino改成didiy…

数据结构*搜索树

什么是搜索树 搜索树是一种树形数据结构,用于高效地存储和检索数据。其核心特点是每个节点包含一个键(Key),并遵循特定的排序规则。常见的搜索树有二叉搜索树、自平衡二叉树、多叉搜索树等。AVL树、红黑树、Splay树都属于自平衡二…

语音交互新纪元:Hugging Face LeRobot如何让机器人真正“懂你”

机器人之言:早在2024年,Hugging Face正式进军真实世界机器人应用领域,推出了开源机器人项目LeRobot。LeRobot不仅仅是一个模型库,它是一个完整的机器人学习平台,融合了模仿学习、强化学习、数据可视化以及仿真环境。其…

搭建个人博客系列--MySql

前期提要:搭建个人博客系列--docker-CSDN博客 目前已经拥有了docker所以只需要将MySql安装在docker上即可。 一、在docker安装mysql docker pull mysql 二、查询docker内的mysql镜像 三、启动msql docker run -d -p 33060:3306 -v /home/mysql/conf:/mysql/conf.d…

【Spring】Spring Boot + OAuth2 + JWT + Gateway的完整落地方案,包含认证流程设计

Spring Boot OAuth2 JWT Gateway的完整落地方案,包含认证流程设计网关在服务中的使用一、整体架构设计二、核心组件实现1. OAuth2认证服务器(auth-service)2. JWT自定义增强(存储用户信息)三、Gateway全局拦截&…

第一个小程序

一、前言随着移动互联网的发展,用户对“即用即走”的轻量级应用需求日益增长,而传统 App 在下载安装、更新维护等方面存在一定的门槛。小程序应运而生,它是一种无需下载即可使用的应用程序形态。本文将带你完成人生中第一个微信小程序的开发全…

【办公类-54-07】20250901 2025学年第一学期班级点名册模版(双休国定假涂成灰色、修改标题和页眉,批量导出PDF)

背景需求: 制作了校历单后,第二个要制作的就是点名册(灰色版) 【办公类-54-03】20240828班级点名册模版(双休国定假涂成灰色)2024学年第一学期_姓名周一到周五的点名册怎么画-CSDN博客文章浏览阅读2.1k次,点赞24次,收藏4次。【办公类-54-03】20240828班级点名册模版(…

iOS App首次启动请求异常调试:一次冷启动链路抓包与初始化流程修复

在一次 iOS App 大版本更新后,部分用户反馈首次打开 App 时会出现“无法连接服务器”的提示,需要重启 App 才能正常使用。而后续使用过程中接口调用都正常。服务器端并未记录请求到达,日志中只有 sporadic(零星)断连记…

【Linux网络篇】:网络中的其他重要协议或技术——DNS,ICMP协议,NAT技术等

✨感谢您阅读本篇文章,文章内容是个人学习笔记的整理,如果哪里有误的话还请您指正噢✨ ✨ 个人主页:余辉zmh–CSDN博客 ✨ 文章所属专栏:Linux篇–CSDN博客 文章目录其他重要协议或技术1.DNS2.ICMP协议3.NAT技术4.代理服务器其他重…

HarmonyOS学习4 --- 创建一个页面

1、声明式UI语法Entry Component struct My_page {State isLogin: boolean falsebuild() {Row() {Image(this.isLogin ? $r(app.media.icon_leon) : $r(app.media.icon)).height(60).width(60).onClick(() > {this.isLogin !this.isLogin})Text(this.isLogin ? $r(app.s…

【Java EE】Spring MVC 的使用

1. 路由映射:RequestMapping:当用户访问某个 URL 时,该注解会根据 URL 的路径映射到具体的程序中对应的类或方法(路由映射)。修饰方法时,路径为类路径 方法路径。默认情况下同时支持 GET 和 POST&#xff…

pip 安装默认切换到国内镜像(清华园,阿里云等)

国内Python包镜像地址如下: 清华:https://pypi.tuna.tsinghua.edu.cn/simple/阿里云:https://mirrors.aliyun.com/pypi/simple/中国科技大学:https://pypi.mirrors.ustc.edu.cn/simple/华为云:https://repo.huaweiclou…