js通過Object.defineProperty() 定義和控制對象屬性

来源:https://www.cnblogs.com/smallstone/p/18038659
-Advertisement-
Play Games

這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 一、錯誤類型 任何一個框架,對於錯誤的處理都是一種必備的能力 在Vue 中,則是定義了一套對應的錯誤處理規則給到使用者,且在源代碼級別,對部分必要的過程做了一定的錯誤處理。 主要的錯誤來源包括: 後端介面錯誤 代碼中本身邏輯錯誤 二、如何 ...


概述

  用於給一個對象定義一個新屬性或是修改某個現有屬性,並返回此對象。Object.defineProperty(obj,prop,descriptor) 它接收 3 個參數,第 1 個是要定義屬性的對象;第 2 個是要定義或修改的屬性的屬性名或 Symbol;第 3 個是對該屬性的描述,稱之為屬性描述符,為一個對象,可以擁有 4 個 key。

  • value:設置屬性值,預設undefined;
  • writable:是否可以重寫,true | false,預設false;
  • enumerable:目標屬性是否可以被枚舉,true | false,預設false;
  • configerable:目標屬性是否可以刪除或者再次修改特性,true | false,預設false;

屬性描述

  • enumerable:描述該屬性是否是可枚舉的。如下例子,new 一個包含name和sex屬性的person實例,然後通過Object.defineProperty()定義屬性age, 然後通過for語句變數person對象的屬性,看看效果:
  • let person={name:'feixue', sex:0};
    Object.defineProperty(person,'age',
    {
        value:30,
        enumerable:false
    })
    console.log(person);
    for(let key in person)
    {
        console.log(key);
    }

    如下圖,person有3個屬性{name:'feixue',sex:0,age:30}。其中age是通過Object.defineProperty()定義的,enumerable設置false。 當遍歷person時只能看到name和sex, 看不到age。 當enumerable設置true時,遍歷person可以看到age屬性(自行嘗試)

 

  • value:屬性的值,可以設置和修改。註意:如果允許屬性可修改,需要設置‘writable':true。示例如下,修改age的值,看看效果:
    •  1 let person={name:'feixue', sex:0};
       2 Object.defineProperty(person,'age',
       3 {
       4     value:30,
       5     enumerable:false,
       6     writable:true
       7 })
       8 console.log(person);
       9 person.age=40;
      10 console.log(person);

      如下圖,age初始值是30,通過修改設置成40

  • get /set : get設置屬性值,get 獲取屬性值 
    •  1 let person={name:'feixue', sex:0};
       2 let _age=45;
       3 Object.defineProperty(person,'age',
       4 {
       5     get:function()
       6     {
       7         return _age;
       8     },
       9     set(value)
      10     {
      11         _age=value;
      12     }
      13 })
      14 console.log("age is "+person.age);
      15 person.age=60;
      16 console.log("age is "+person.age);

      如圖所示,getter和setter可以寫成get(){}/set(value){} 或者 get:function{}/set:function(value){} 。 當屬性被獲取時,會執行getter函數。當屬性被設置時,會執行setter函數。

 

 請註意, 使用getter 和 setter ,就不可以設置value了。請看下麵的示例,同時使用getter/setter 和 value會報什麼錯誤?

    •  1 let person={name:'feixue', sex:0};
       2 let _age=45;
       3 Object.defineProperty(person,'age',
       4 {
       5     value:30,
       6     get:function()
       7     {
       8         return _age;
       9     },
      10     set(value)
      11     {
      12         _age=value;
      13     }
      14 })
      15 console.log(person);

        此處同時使用了value和 getter/setter, 報錯信息如下

另外,使用value和 getter/setter 還是有區別的, 請看下圖, 2者有什麼區別? 如下圖,圖一使用了vue, 圖二使用了getter/setter.

 

   


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

-Advertisement-
Play Games
更多相關文章
  • 本文分享自華為雲社區《GaussDB(DWS)存儲引擎:從CU入手優化HStore表》,作者: yd_261437590。 1. 前言 適用版本:【8.2.1(及以上)】 HStore同時擁有處理傳統TP場景的事務能力和強大的數據分析能力,但是強大的數據分析能力很可能被小CU問題給破壞,另外,將多個 ...
  • 序言 開年的第一篇文章,今天分享的是SwiftUI,SwiftUI出來好幾年,之前一直沒學習,所以現在才開始;如果大家還留在 iOS 開發,這們語言也是一個趨勢; 目前待業中.... 不得不說已逝的2023年,大家開始都抱著一解封,經濟都會向上轉好,可是現實不是我們想象那樣;目前我也在學習 Swif ...
  • 方案一 :可以用 if來替代 如下 原因:在Android Studio中使用JDK17以上版本,會出現switch語句報錯"Constant expression required"的問題,這是因為在JDK17中switch語句的條件表達式支持使用枚舉類型,而這個特性還沒有被支持。 方案2:換JD ...
  • 一、混淆的意義 混淆代碼並不是讓代碼無法被反編譯,而是將代碼中的類、方法、變數等信息進行重命名,把它們改成一些毫無意義的名字,同時也可以移除未被使用的類、方法、變數等。 所以直觀的看,通過混淆可以提高程式的安全性,增加逆向工程的難度,同時也有效縮減了apk的體積。總結如下: 1、將項目中的類、方法、 ...
  • 有時候下載sdk的時候報各種錯誤導致無法下載,如圖 那麼可以離線下載,到瀏覽器或IDM中下載圖中提示的url鏈接,將第一個下載的包即sources的解壓後放到SDK目錄下的sources目錄,並重命名為對應的api版本如android-25 第二個鏈接即platform的那個則解壓後放到SDK目錄中 ...
  • 至於未來會怎樣,要走下去才知道反正路還很長,天總會亮。 1. 面向對象 1.1 什麼是面向對象(OOP) 面向對象 Object Oriented Programming。在軟體開發中,我們雖然用的是面向對象的語言,但我相信絕大多數入門或者工作經驗不長的同學敲出來的代碼依然是大段的面向過程的思想,我 ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 一、如何部署 前後端分離開發模式下,前後端是獨立佈署的,前端只需要將最後的構建物上傳至目標伺服器的web容器指定的靜態目錄下即可 我們知道vue項目在構建後,是生成一系列的靜態文件 常規佈署我們只需要將這個目錄上傳至目標伺服器即可 // ...
  • 寫在前面 學習、寫作、工作、生活,都跟心情有很大關係,甚至有時候我更喜歡一個人獨處,戴上耳機coding的感覺。 明顯現在的心情,比中午和上午好多了,心情超棒的,靠自己解決了兩個問題: 新增的時候點擊TreeSelect控制項控制台會給出報錯 分類新增和編輯時,報錯父類和電子書iD不能為空的問題 富文 ...
一周排行
    -Advertisement-
    Play Games
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...
  • 目錄前言PostgreSql安裝測試額外Nuget安裝Person.cs模擬運行Navicate連postgresql解決方案Garnet為什麼要選擇Garnet而不是RedisRedis不再開源Windows版的Redis是由微軟維護的Windows Redis版本老舊,後續可能不再更新Garne ...
  • C#TMS系統代碼-聯表報表學習 領導被裁了之後很快就有人上任了,幾乎是無縫銜接,很難讓我不想到這早就決定好了。我的職責沒有任何變化。感受下來這個系統封裝程度很高,我只要會調用方法就行。這個系統交付之後不會有太多問題,更多應該是做小需求,有大的開發任務應該也是第二期的事,嗯?怎麼感覺我變成運維了?而 ...
  • 我在隨筆《EAV模型(實體-屬性-值)的設計和低代碼的處理方案(1)》中介紹了一些基本的EAV模型設計知識和基於Winform場景下低代碼(或者說無代碼)的一些實現思路,在本篇隨筆中,我們來分析一下這種針對通用業務,且只需定義就能構建業務模塊存儲和界面的解決方案,其中的數據查詢處理的操作。 ...
  • 對某個遠程伺服器啟用和設置NTP服務(Windows系統) 打開註冊表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer 將 Enabled 的值設置為 1,這將啟用NTP伺服器功 ...
  • title: Django信號與擴展:深入理解與實踐 date: 2024/5/15 22:40:52 updated: 2024/5/15 22:40:52 categories: 後端開發 tags: Django 信號 松耦合 觀察者 擴展 安全 性能 第一部分:Django信號基礎 Djan ...
  • 使用xadmin2遇到的問題&解決 環境配置: 使用的模塊版本: 關聯的包 Django 3.2.15 mysqlclient 2.2.4 xadmin 2.0.1 django-crispy-forms >= 1.6.0 django-import-export >= 0.5.1 django-r ...
  • 今天我打算整點兒不一樣的內容,通過之前學習的TransformerMap和LazyMap鏈,想搞點不一樣的,所以我關註了另外一條鏈DefaultedMap鏈,主要調用鏈為: 調用鏈詳細描述: ObjectInputStream.readObject() DefaultedMap.readObject ...
  • 後端應用級開發者該如何擁抱 AI GC?就是在這樣的一個大的浪潮下,我們的傳統的應用級開發者。我們該如何選擇職業或者是如何去快速轉型,跟上這樣的一個行業的一個浪潮? 0 AI金字塔模型 越往上它的整個難度就是職業機會也好,或者說是整個的這個運作也好,它的難度會越大,然後越往下機會就會越多,所以這是一 ...
  • @Autowired是Spring框架提供的註解,@Resource是Java EE 5規範提供的註解。 @Autowired預設按照類型自動裝配,而@Resource預設按照名稱自動裝配。 @Autowired支持@Qualifier註解來指定裝配哪一個具有相同類型的bean,而@Resourc... ...