深入理解ES6 012【學習筆記】

代理(Proxy)和反射(Reflection)API

代理是一種可以攔截並改變底層JavaScript引擎操作的包裝器,在新語言中透過它暴露內部運作物件,從而讓開發者可以建立內建的物件。

代理陷阱 覆寫的特性 預設特性
get 讀取一個屬性值 Reflect.get()
set 寫入一個屬性值 Reflect.set()
has in運算子 Reflect.has()
deleteProperty delete運算子 Reflect.deleteProperty()
getPropertyOf Object.getPropertyOf() Reflect.getPropertyOf()
setPropertyOf Object.setPropertyOf() Reflect.setPropertyOf()
isExtensible Object.isExtensible() Reflect.isExtensible()
preventExtensions Object.preventExtensions() Reflect.preventExtensions()
getOwnPropertyDescriptor Object.getOwnPropertyDescriptor() Reflect.getOwnPropertyDescriptor()
defineProperty Object.defineProperty() Reflect.defineProperty()
ownKeys Object.keys()
Object.getOwnPropertyNames()
Object.getOwnPropertySymbols()
Reflect.ownKeys()
apply 呼叫一個函式 Reflect.apply()
construct 用new呼叫一個函式 Reflect.construct()

## 建立一個簡單的代理

 let target = {}
 let proxy = new Proxy(target,{}),

 proxy.name = "proxy";
 console.log(proxy.name) // proxy
 console.log(target.name) // proxy

 target.name = "target"
console.log(proxy.name) // target
 console.log(target.name) // target

使用set陷阱驗證屬性

接受4個參數

  • trapTarget 用於接收屬性(代理的目標) 的物件
  • key 要寫入的屬性鍵
  • value 被寫入屬性之值
  • receiver 操作發生的物件(通常是代理)
let target = {
  name:"target"
}
let proxy = new Proxy(target,{
  set(trapTarget,key,value,recevier){
    // 忽略不希望受到影響的已有屬性
    if(!trapTarget.hasOwnProperty(key)){
      if(isNaN(value)){
        throw new TypeError('屬性必須是數字')
      }
    }
    // 新增屬性
    return Reflect.set(trapTarget,key,value,recevier)
  }
})
proxy.count = 1;
console.log(proxy.count) // 1
console.log(target.count) // 1

// 由於目標已經有name屬性因而可以給它賦值
proxy.name = "proxy"
console.log(proxy.name) // proxy
console.log(target.name) // proxy
// 給不存在的屬性賦值會拋出錯誤
proxy.otherName = "proxy"

後面的不想看……有空再說吧

主題測試文章,只做測試使用。發佈者:Walker,轉轉請注明出處:https://walker-learn.xyz/archives/4340

(0)
Walker的頭像Walker
上一篇 2025年4月20日 19:12
下一篇 2025年11月25日 16:00

相關推薦

  • 無畏前行,拳釋力量 🥊💪

    拚搏,是一種態度。生活就像一場比賽,沒有捷徑可走,只有不斷訓練、突破、超越,才能站上屬於自己的舞台。這不僅是一種對抗,更是一種自我的覺醒——敢於迎戰,敢於挑戰,敢於成為更強的自己。 運動中的拚搏精神 無論是拳擊、跑步,還是力量訓練,每一次出拳、每一次揮汗、每一次咬牙堅持,都是對身體與心靈的磨練。拚搏不是單純的對抗,而是一種態度——面對挑戰,不退縮;面對失敗,…

    個人 2025年2月26日
    1.5K00
  • Go 工程師體系課 012【學習筆記】

    在 Go 中整合 Elasticsearch 1. 客戶端函式庫選擇 1.1 主流 Go ES 客戶端 olivere/elastic:功能最完整,API 設計優雅,支援 ES 7.x/8.x elastic/go-elasticsearch:官方客戶端,輕量級,更接近原生 REST API go-elasticsearch/elasticsearch:社群維護的官…

    個人 2025年11月25日
    32800
  • 深入理解ES6 009【學習筆記】

    JavaScript 中的類別 function PersonType(name){ this.name = name; } PersonType.prototype.sayName = function(){ console.log(this.name) } var person = new PersonType("Nicholas") p…

    個人 2025年3月8日
    1.3K00
  • Go工程師體系課 011【學習筆記】

    查詢的倒排索引 1. 什麼是倒排索引? 倒排索引(Inverted Index)是一種資料結構,用於快速查找包含特定詞彙的文件。它是搜尋引擎的核心技術之一。 1.1 基本概念 正排索引:文件 ID → 文件內容(詞列表) 倒排索引:詞 → 包含該詞的文件 ID 列表 1.2 為什麼叫"倒排"? 倒排索引將傳統的"文件包含哪些詞"的關係倒轉為"詞出現在哪些文件…

    個人 2025年11月25日
    31200
  • 深入理解ES6 003【學習筆記】

    函數參數預設值,以及一些關於 arguments 物件,如何使用運算式作為參數、參數的暫時性死區。 以前設定預設值總是利用在含有邏輯或運算子的運算式中,前一個值是 false 時,總是回傳後面那個值,但如果我們給參數傳入 0 時,就會有些麻煩。 需要去驗證一下型別 function makeRequest(url,timeout,callback){ timeout = t…

    個人 2025年3月8日
    1.4K00
簡體中文 繁體中文 English