Proxy和Reflect

Proxy

Proxy就是目標(biāo)對(duì)象之前架設(shè)一層“攔截”,外界對(duì)該對(duì)象的訪問,都必須先通過這層攔截

  • 基本用法
let obj={}
let objProxy = new Proxy(obj, {
  get: function (target, propKey, receiver) {//獲取obj的propKey時(shí)觸發(fā)
    console.log(`getting ${propKey}!`);
    return Reflect.get(target, propKey, receiver);
  },
  set: function (target, propKey, value, receiver) {//設(shè)置obj的propKey時(shí)觸發(fā)
    console.log(`setting ${propKey}!`);
    return Reflect.set(target, propKey, value, receiver);
  }
});
  • 13個(gè)攔截操作
// new Proxy(obj, handle)
// handle支持的屬性
1. get(target, propKey, receiver){//讀取對(duì)象屬性攔截,一般用來收集依賴,receiver代表Proxy對(duì)象本身} 

2. set(target, propKey, value, receiver){// 設(shè)置target的propKey為value的攔截}

3. has(target, propKey){// 攔截propKey in proxy的操作}  

4. deleteProperty(target, propKey){// 攔截delete proxy[propKey]的操作}

5. construct (target, args, newTarget) {
    return new target(...args);// 攔截target的new命令
  }

6. setPrototypeOf(target, proto)方法主要用來攔截 修改原型對(duì)象Object.setPrototypeOf()方法

7. getPrototypeOf()方法主要用來攔截獲取對(duì)象原型

8. apply (target, ctx, args) {// 攔截函數(shù)的調(diào)用、call和apply操作
    return Reflect.apply(...arguments);
  }

9. ownKeys(target)// 攔截獲取對(duì)象屬性值的操作

10. getOwnPropertyDescriptor(target,propKey){
  //攔截獲取對(duì)象屬性的描述值的操作Object.getOwnPropertyDescriptor
}

11. defineProperty(){
// 攔截Object.defineProperty(target, key, descriptor)、Object.defineProperties(proxy, propDescs)
}

12. preventExtensions()方法攔截Object.preventExtensions()

13. isExtensible()方法攔截Object.isExtensible()操作
  • 對(duì)比Object.defineProperty
Object.defineProperty 是監(jiān)聽對(duì)象的字段而非對(duì)象本身,因此對(duì)于動(dòng)態(tài)插入對(duì)象的字段,它無能為了,只能手動(dòng)為其設(shè)置設(shè)置監(jiān)聽屬性。

Object.defineProperty 無法監(jiān)聽對(duì)象中數(shù)組的變化,因此其他基于 Object.defineProperty 都對(duì)數(shù)組做了一定的 Hack 處理。

Proxy 可以為一個(gè)對(duì)象設(shè)置代理,即監(jiān)聽對(duì)象本身,任何訪問當(dāng)前被監(jiān)聽的對(duì)象的操作,無論是對(duì)象本身亦或是對(duì)象的字段,都會(huì)被 Proxy 攔截。

Proxy不需要深度遍歷監(jiān)聽,性能高于Object.defineProperty;


Reflect對(duì)象

  1. 將Object對(duì)象的一些明顯屬于語言內(nèi)部的方法放到Reflect對(duì)象上
  2. 修改某些Object方法的返回結(jié)果,讓其變得更合理
  3. 讓Object操作都變成函數(shù)行為。某些Object操作是命令式,比如name in obj和delete obj[name],而Reflect.has(obj, name)和Reflect.deleteProperty(obj, name)讓它們變成了函數(shù)行為
  • Reflect對(duì)象的方法與Proxy對(duì)象的方法一一對(duì)應(yīng)

  • 可以用Reflect代替Object的操作

Reflect.get(myObject, 'foo') 
Reflect.has(myObject, 'foo') // true
Reflect.deleteProperty(myObj, 'foo');

const myObj = new FancyThing();
// 新寫法
Reflect.getPrototypeOf(myObj) === FancyThing.prototype;
...
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Proxy Proxy可以理解成,在目標(biāo)對(duì)象之前架一層‘?dāng)r截’,外界對(duì)該對(duì)象的訪問,都必須先通過這層攔截,因此提供...
    nomooo閱讀 1,100評(píng)論 0 4
  • 很有意思的一章 Proxy get 利用Proxy,可以將讀取屬性的操作(get),轉(zhuǎn)變?yōu)閳?zhí)行某個(gè)函數(shù),從而實(shí)現(xiàn)屬...
    KeithFu閱讀 704評(píng)論 0 0
  • Proxy 對(duì)象 Proxy 用來修改某些默認(rèn)操作,等同于在語言層面做出修改。所以屬于一種元編程(meta pro...
    faremax閱讀 429評(píng)論 0 0
  • proxy:可以理解為一種權(quán)限設(shè)置,將一些數(shù)據(jù)攔截,使得訪問的時(shí)候只能訪問到設(shè)定的內(nèi)容var proxy = ne...
    燈不梨喵閱讀 668評(píng)論 1 1
  • 一、Proxy 1.什么是proxy Proxy 可以理解成,在目標(biāo)對(duì)象之前架設(shè)一層“攔截”,外界對(duì)該對(duì)象的訪問,...
    錢羅羅_閱讀 837評(píng)論 0 0

友情鏈接更多精彩內(nèi)容