Object.defineProperties 詳解

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…