ES6 Reflect使用筆記

来源:https://www.cnblogs.com/qiqingfu/archive/2018/11/24/10013336.html
-Advertisement-
Play Games

Reflect Reflect 對象和Proxy對象一樣, 為操作對象提供了新的API。 為什麼使用 Reflect的方式來操作對象? 將 Object 對象上一些明顯屬於內部的方法放到 Reflect對象上。比如 也可以使用 修改某些 Object 方法的返回結果 讓 Object 操作都變成函數 ...


Reflect

Reflect 對象和Proxy對象一樣, 為操作對象提供了新的API。

為什麼使用 Reflect的方式來操作對象?

  • 將 Object 對象上一些明顯屬於內部的方法放到 Reflect對象上。比如 Object.defindProperty 也可以使用 Reflect.defindProperty

  • 修改某些 Object 方法的返回結果

  • 讓 Object 操作都變成函數行為。

  • Reflect 對象的操作方法和 Proxy的方法一一對應, 很方便 Proxy對象來調用 Reflect 方法

例子:

    const sum = function (num1, num2) {
        return num1 + num2
    }
    const proxy = new Proxy(sum, {
        apply(target, context, args) {
            return Reflect.apply(...arguments) * 2
        }
    })
    proxy(1,2)  // 6

以上代碼 proxy 的配置方法 apply和 Reflect的apply方法是對應關係,直接通過 Reflect.apply 來調用攔截函數 sum。並將函數執行後的結果 * 2。最終的結果是 6。

#### Reflect 對象和 Proxy的靜態方法一樣,同樣是13個。

  • Reflect.apply(target, context, args)
  • Reflect.get(target, key, context)
  • Reflect.set(target, key, value, context)
  • Reflect.construct(target, args)
  • Reflect.defindProperty(target, key, desc)
  • Reflect.has(target, key)
  • Reflect.deleteProperty(target, key)
  • Reflect.setProperty(target, proto)
  • Reflect.getProperty(target)
  • Reflect.ownKeys(target)
  • Reflect.isExtensible(target)
  • Reflect.preventExtensions(target)
  • Reflect.getOwnPropertyDescriptor(target, key)

Reflect.get(target, key, context)

target: 查找的對象
key: 查找的屬性
context: 讀取getter函數的上下文對象

    const obj = {
        name: 'qiqingfu',
        get sayName() {
            console.log(this.name)
        }
    }
    const obj1 = {
        name: 'zhangfei'
    }
    Reflect.get(obj, 'name')  // qiqingfu 
    Reflect.get(obj, 'sayName', obj1) // zhangfei 

如果第一個參數不是對象, Reflect.get方法會報錯。

Reflect.set(target, key, value, context)

target: 要給哪個對象設置
key: 要設置的屬性
value: 設置的值
返回值: boolean

    const obj = {
      value: 1,
      set fn(newValue) {
        return this.value = newValue
      }
    }  
    console.log(Reflect.set(obj, 'name', 'qiqingfu'))  // true
    console.log(Reflect.set(obj, 'fn', 2))
    console.log(obj)

以上代碼,給obj對象設置了一個name屬性,其值為qiqingfu, 並且設置fn的時候被get函數攔截到了。

Reflect.has(target, key) 方法檢測 target對象上有麽有 key這個屬性

返回值: boolean

const obj = {
      name: 'qiqingfu',
      a: 2
    }
    console.log(Reflect.has(obj, 'name'))  // true
    console.log(Reflect.has(obj, 'a'))     // true
    console.log(Reflect.has(obj, 'b'))     // false

其實 Reflect.hasin 操作符類似。

Reflect.construct(target, args) 方法用於類似於 new 操作符

target: 目標函數
args: 實例化對象需要傳遞的參數 Array
返回值: 實例對象

    function Prosen (name, age) {
      this.name = name;
      this.age = age
    }
    const prosen = Reflect.construct(Prosen, ['qiqingfu', 22])
    // {name: 'qiqingfu', age: 22}

以上代碼使用 Reflect.construct方法實例話一個對象,接受的參數為數組類型

Reflect.defineProperty(target, key, decs) 和 Object.defineProperty(target, key, decs) 一樣

更推崇使用前者。

方法會直接在一個對象上定義一個新屬性,或者修改一個對象的現有屬性, 並返回這個對象。

    const obj = {
      
    }
    Reflect.defineProperty(obj, 'a', {
      value: 1,
      configurable: true, // 可配置
      writable: true      // 可寫
    })
    // {a: 1}

以上代碼給 obj 對象添加了一個 a屬性, 其值為1並且是可配置和可修改的

Reflect.deleteProperty(target, key) 方法刪除 target對象的key屬性

    const obj = {
        a: 1
    }
    Reflect.defindProperty(obj, 'a')
    console.log(obj) // {}

Reflect.getPropertyOf(target) 方法獲取一個對象的原型對象

    function Prosen() {

    }
    Prosen.prototype.age = 21
    const prosen = Reflect.construct(Prosen, [])
    // 獲取原型對象的屬性 
    const proto = Reflect.getPrototypeOf(prosen)
    console.log(proto)
    // {age: 21, constructor: ƒ}

以上代碼 給 Prosen 構造函數的原型對象上添加了一個 age屬性。並且通過 Reflect.construct方法實例化一個對象。那麼就可以通過 Reflect.getPrototypeOf 方法獲取一個對象的原型對象。

Reflect.setPrototypeOf(target, proto) 方法將 proto設置為 target對象的原型對象

    function Prosen() {

    }
    Prosen.prototype.age = 21
    const prosen = Reflect.construct(Prosen, [])
   
   // 設置prosen 的原型對象
   Reflect.setPrototypeOf(prosen, {b: 2}) 

此時, prosen的原型對象為 {b:2}, 而 construct 指針會被覆蓋

Reflect.ownKeys(target) 獲取對象的key值,返回值為數組

Object.ownKeys 相同。

    const obj = {
      a: 1,
      [Symbol('c')]: 3,
    }
    Reflect.defineProperty(obj, 'b', {
      value: 2,
      configurable: true,
      enumerable: true
    })
    console.log(Reflect.ownKeys(obj))
    // ["a", "b", Symbol(c)]

返回值是一個數組, 存放著對象的 key值的集合。

Reflect.getOwnPropertyDescriptor(target, key) 方法獲取一個對象key值的描述對象

返回值: Object

    const obj = {
      a: 1,
      [Symbol('c')]: 3,
    }
    Reflect.defineProperty(obj, 'b', {
      value: 2,
      configurable: true,
      enumerable: true
    })
    const decs = Reflect.getOwnPropertyDescriptor(obj, 'b')
    console.log(decs)
    /*
      {value: 2, writable: false, enumerable: true, configurable: true}
    */

以上代碼通過 Reflect.getOwnPropertyDescriptor方法獲取一個對象屬性的描述對象, 如果第一個參數不是對象會報錯。而在 Object.getOwnPropertyDescriptor不會報錯,只不過返回 undefind


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

-Advertisement-
Play Games
更多相關文章
  • 1.軟硬體準備軟體:推薦使用VMwear,我用的是VMwear 10鏡像:CentOS7 硬體:因為是在宿主機上運行虛擬化軟體安裝centos,I3CPU雙核、硬碟500G、記憶體4G以上。 2.虛擬機準備1.打開VMwear選擇新建虛擬機 2.典型安裝與自定義安裝典型安裝:VMwear會將主流的配置 ...
  • Redis概述 1.是一個開源的,先進的<key,value>存儲,並用與構建高性能,可擴展的應用程式的完美解決方案 2.從它的許多競爭繼承來的三個主要特點: l Redis資料庫完全在記憶體中,使用磁碟僅用於持久性。 l 相比許多鍵值數據存儲,Redis擁有一套較為豐富的數據類型。String,Li ...
  • [20181124]關於降序索引問題3.txt--//鏈接:blog.itpub.net/267265/viewspace-2221425/,探討降序索引中索引的鍵值。--//實際上使用函數sys_op_descend.--//鏈接:http://blog.itpub.net/267265/view ...
  • [20181124]關於降序索引問題2.txt--//鏈接:blog.itpub.net/267265/viewspace-2221425/,探討降序索引中索引的鍵值。--//實際上使用函數sys_op_descend.--//前面已經提到結尾加入FF,為了排序的需要。這樣導致chr(0),以及後續 ...
  • MongoDB高級應用 Author:SimpleWu 聚合 聚合(aggregate)主要用於處理數據(諸如統計平均值,求和等),並返回計算後的數據結果。有點類似sql語句中的 count( )。 $group 使用$group是對篩選的數據進行分組。類似於mysql中的group by關鍵字。 ...
  • 不管你是從事Python、Java、Go、PHP、Ruby等等… Redis都應該是一個比較熟悉的中間件。而大部分經常寫業務代碼的程式員,實際工作中或許只用到了set value、get value兩個操作。對Redis缺乏一個整體的認識。今天就來對Redis的常見問題做一個總結。希望能夠幫助到大家 ...
  • 事務定義 事務是訪問並更新資料庫中各個數據項的一個程式執行單元。在事務操作中,要不都做修改,要麼都不做。 事務特性 事務具有ACID四個特性,分別是:原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability)。 原子性 原子性是指要麼 ...
  • 在上一篇 學習安卓開發[2] 在Activity中托管Fragment 中瞭解了使用Fragment的好處和方法,本次記錄的是在進行列表展示時RecyclerView的使用。 RecyclerView介紹 RecyclerView及其相關類 RecyclerView的應用 引入RecyclerVie ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...