Object.defineProperty方法 與 數據代理

来源:https://www.cnblogs.com/PaturNax/archive/2022/07/20/16498124.html
-Advertisement-
Play Games

const person = { name: 'Lydia' } Object.defineProperty(person, 'age', { value: 21, }) console.log(person) console.log(Object.keys(person)) 輸出結果 原因: de ...


const person = { name: 'Lydia' }

Object.defineProperty(person, 'age', {
  value: 21,
})

console.log(person)
console.log(Object.keys(person))

輸出結果

原因:

defineProperty方法提供給我們(getter)給對象添加一個新屬性,或者通過(setter)修改已經存在的屬性,當然上面的例子只涉及到最簡單的修改。

const person = { name: 'Lydia' }
let number=21;
Object.defineProperty(person, 'age', {
//   value:21,
  enumerable:true, //控制屬性是否可以枚舉,預設值是false
  // writable:true, //控制屬性是否可以被修改,預設值是false
  // configurable:true //控制屬性是否可以被刪除,預設值是false

  //當有人讀取person的age屬性時,get函數(getter)就會被調用,且返回值就是age的值
  get() {
    console.log('有人讀取age屬性了')
    return number
  },

  //當有人修改person的age屬性時,set函數(setter)就會被調用,且會收到修改的具體值
  set(value) {
    number = value
  },
});

age屬性會自動幫我們轉為setter/getter,等我們真正需要或者修改,則會顯示出對應的age屬性

而在使用了該方法給對象添加一個屬性後,屬性便預設為 不可枚舉 not enumerable

因此Object.keys方法僅返回對象中 可枚舉 enumerable的屬性,即代碼中的name

添加屬性改變Object.defineProperty方法的預設行為

之所以有以下的寫法,也是為我們相比於添加到對象中的屬性有更多控制權

Object.defineProperty(person, 'age', {
  value:21,
  // enumerable:true, //控制屬性是否可以枚舉,預設值是false
  // writable:true, //控制屬性是否可以被修改,預設值是false
  // configurable:true //控制屬性是否可以被刪除,預設值是false
})

數據代理

定義:
通過一個對象代理對另一個對象中屬性的讀或寫操作,而我們可以通過Object.defineProperty方法實現

//創建對象1
let obj = { x: 100 }
//創建對象2
let obj2 = { y: 200 }
//我希望可以令對象2代理對象1,併進行相應的操作
Object.defineProperty(obj2, 'x', {
  get() {
    return obj.x
  },
  set(value) {
    obj.x = value
  },
})

可以看到確實能實現(註意要在開發者模式的控制臺下操作)


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Clobbr是一款開發人員必備的工具,使用它可以測試您的api端點,以查看它們在多個請求(破壞您的 api!)下的執行情況,順序或並行,滿足您測試REST、GraphQL、雲函數、Clobbr 的需求。可以輕鬆向多個端點發出請求;輕鬆配置動詞(GET、PUT、POST 等);為每個請求配置標頭;擁有 ...
  • 04 | 深入淺出索引(上) 索引的出現其實就是為了提高數據查詢的效率,就像書的目錄一樣 索引的常見模型 哈希表、有序數組和搜索樹 哈希表 User2 和 User4 根據身份證號算出來的值都是 N,但沒關係,後面還跟了一個鏈表。 需要註意的是,圖中四個 ID_card_n hash 出來的值並不是 ...
  • 先上命令速查網站,菜鳥yyds https://www.runoob.com/redis/redis-strings.html 操作redis的包是go-redis/redis 官方文檔 https://redis.uptrace.dev/guide/ github https://github.c ...
  • SQL的多表查詢 多表查詢的概述 指從多張表中查詢數據; 各個表格之間相互關聯,基本分為:一對多(多對一)、多對多、一對一; 語法 select * from 表1,表2; 查詢分類 連接查詢: **內連接:**相當於查詢A、B表的交集部分數據; 外連接: **左外連接:**查詢左表所以數據,以及兩 ...
  • 03 | 事務隔離:為什麼你改了我還看不見? 事務 Transaction TRX 事務就是要保證一組資料庫操作,要麼全部成功,要麼全部失敗。 MySQL 原生的 MyISAM 引擎不支持事務 隔離性與隔離級別 SQL 標準的事務隔離級別包括:讀未提交(read uncommitted)、讀提交(r ...
  • 人臉識別目前已廣泛應用於手機解鎖、刷臉支付、閘機身份驗證等生活場景,然而,人臉識別能力雖帶來了極大的便利,卻無法鑒別人臉是否真實,比如使用高模擬圖片、精密石膏或3D建模面具,即可輕鬆攻破人臉識別演算法,單獨使用該能力存在極大的安全隱患。 華為機器學習服務的動作活體檢測能力,通過採用指令動作配合的方式進 ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 一、什麼是WebSocket WebSocket 是一種在單個TCP連接上進行全雙工通信的協議。WebSocket 使得客戶端和伺服器之間的數據交換變得更加簡單,允許服務端主動向客戶端推送數據。 在 WebSocket API 中,瀏覽器 ...
  • 主要講解運用Webpack 5 中集成 ESLint 的方法與步驟 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...