Proxy & Reflect

一、Proxy

????1.什么是proxy

????????Proxy 可以理解成,在目標(biāo)對象之前架設(shè)一層“攔截”,外界對該對象的訪問,都必須先通過這層攔截,我理解跟object.definePrototype的setter和getter有點像。因此提供了一種機(jī)制,可以對外界的訪問進(jìn)行過濾和改寫。Proxy 實際上重載(overload)了點運算符,即用自己的定義覆蓋了語言的原始定義。

? ? ?2.攔截

????????????作為構(gòu)造函數(shù),Proxy接受兩個參數(shù)。第一個參數(shù)是所要代理的目標(biāo)對象(上例是一個空對象),即如果沒有Proxy的介入,操作原來要訪問的就是這個對象;第二個參數(shù)是一個配置對象,對于每一個被代理的操作,需要提供一個對應(yīng)的處理函數(shù),該函數(shù)將攔截對應(yīng)的操作;

? ??????????要使得Proxy起作用,必須針對Proxy實例(上例是proxy對象)進(jìn)行操作,而不是針對目標(biāo)對象(上例是空對象)進(jìn)行操作

? ? ? ? ? ?如果handler是一個空對象,沒有任何攔截效果,訪問proxy就等同于訪問target。

攔截

? ? ? ? 3.實例方法

? ??????????????get(target, propKey, receiver):用于攔截某個屬性的讀取操作,可以接受三個參數(shù),依次為目標(biāo)對象、屬性名和 proxy 實例本身(嚴(yán)格地說,是操作行為所針對的對象),其中最后一個參數(shù)可選;

? ??????????????set(target, propKey, value, receiver):用來攔截某個屬性的賦值操作,可以接受四個參數(shù),依次為目標(biāo)對象、屬性名、屬性值和 Proxy 實例本身,其中最后一個參數(shù)可選。返回布爾值;

? ??????????????has(target, propKey):攔截HasProperty操作,即判斷對象是否具有某個屬性時,這個方法會生效。典型的操作就是in運算符,返回一個布爾值。

? ??????????????deleteProperty(target, propKey):用于攔截delete操作,如果這個方法拋出錯誤或者返回false

? ???????????????ownKeys(target):攔截對象自身屬性的讀取操作,返回一個數(shù)組。該方法返回目標(biāo)對象所有自身的屬性的屬性名,而Object.keys()的返回結(jié)果僅包括目標(biāo)對象自身的可遍歷屬性。

? ??????????????getOwnPropertyDescriptor(target, propKey):攔截Object.getOwnPropertyDescriptor(),返回一個屬性描述對象或者undefined;

? ??????????????defineProperty(target, propKey, propDesc):攔截了Object.defineProperty操作,返回一個布爾值。

? ???????????????preventExtensions(target):方法攔截Object.preventExtensions()。該方法必須返回一個布爾值,否則會被自動轉(zhuǎn)為布爾值。

? ???????????????getPrototypeOf(target):用來攔截獲取對象原型,返回值必須是對象或者null

? ??????????????isExtensible(target):攔截Object.isExtensible操作,返回一個布爾值。

? ??????????????setPrototypeOf(target, proto):用來攔截Object.setPrototypeOf方法,返回一個布爾值。如果目標(biāo)對象是函數(shù),那么還有兩種額外操作可以攔截。

? ??????????????apply(target, object, args):攔截函數(shù)的調(diào)用、call和apply操作,方法可以接受三個參數(shù),分別是目標(biāo)對象、目標(biāo)對象的上下文對象(this)和目標(biāo)對象的參數(shù)數(shù)組。

? ??????????????construct(target, args):用于攔截new命令,返回的必須是一個對象。

? ? 4.類方法

? ??????Proxy.revocable():返回一個可取消的 Proxy 實例。

? ? 5.this

? ??????在 Proxy 代理的情況下,目標(biāo)對象內(nèi)部的this關(guān)鍵字會指向 Proxy 代理。? ? ? ??

二、Reflect

? ? 1.?是 ES6 為了操作對象而提供的新 API

? ? 2.與Object的區(qū)別

????????????將Object對象的一些明顯屬于語言內(nèi)部的方法(比如Object.defineProperty),放到Reflect對象上;

? ??????????修改某些Object方法的返回結(jié)果,讓其變得更合理

? ??????????讓Object操作都變成函數(shù)行為

? ??????????Reflect對象的方法與Proxy對象的方法一一對應(yīng),只要是Proxy對象的方法,就能在Reflect對象上找到對應(yīng)的方法

? ? ?3. 方法

? ??????Reflect.apply(target, thisArg, args):等同于Function.prototype.apply.call(func, thisArg, args),用于綁定this對象后執(zhí)行給定函數(shù)。

????????Reflect.construct(target, args):等同于new target(...args),這提供了一種不使用new,來調(diào)用構(gòu)造函數(shù)的方法。

????????Reflect.get(target, name, receiver):方法查找并返回target對象的name屬性,如果沒有該屬性,則返回undefined

????????Reflect.set(target, name, value, receiver):設(shè)置target對象的name屬性等于value

????????Reflect.defineProperty(target, name, desc):等同于Object.defineProperty,用來為對象定義屬性。

????????Reflect.deleteProperty(target, name):等同于delete obj[name],用于刪除對象的屬性

????????Reflect.has(target, name):對應(yīng)name in obj里面的in運算符

????????Reflect.ownKeys(target):返回對象的所有屬性,基本等同于Object.getOwnPropertyNames與Object.getOwnPropertySymbols之和。

????????Reflect.isExtensible(target):對應(yīng)Object.isExtensible,返回一個布爾值,表示當(dāng)前對象是否可擴(kuò)展。

????????Reflect.preventExtensions(target):對應(yīng)Object.preventExtensions方法,用于讓一個對象變?yōu)椴豢蓴U(kuò)展。它返回一個布爾值,表示是否操作成功。

????????Reflect.getOwnPropertyDescriptor(target, name):基本等同于Object.getOwnPropertyDescriptor,用于得到指定屬性的描述對象,將來會替代掉后者。

????????Reflect.getPrototypeOf(target):讀取對象的__proto__屬性,對應(yīng)Object.getPrototypeOf(obj)。

????????Reflect.setPrototypeOf(target, prototype):設(shè)置目標(biāo)對象的原型(prototype),對應(yīng)Object.setPrototypeOf(obj, newProto)方法。它返回一個布爾值,表示是否設(shè)置成功


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

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

  • defineProperty() 學(xué)習(xí)書籍《ECMAScript 6 入門 》 Proxy Proxy 用于修改某...
    Bui_vlee閱讀 704評論 0 1
  • Proxy Proxy可以理解成,在目標(biāo)對象之前架一層‘?dāng)r截’,外界對該對象的訪問,都必須先通過這層攔截,因此提供...
    nomooo閱讀 1,100評論 0 4
  • Proxy 概述 Proxy 用于修改某些操作的默認(rèn)行為,等同于在語言層面做出修改,所以屬于一種“元編程”(met...
    pauljun閱讀 3,289評論 0 1
  • Proxy 對象 Proxy 用來修改某些默認(rèn)操作,等同于在語言層面做出修改。所以屬于一種元編程(meta pro...
    faremax閱讀 429評論 0 0
  • 積極的聆聽,不僅是指你要傾聽愛人的講述,還要求你全身心的投入,給予對方足夠的尊重。聆聽時,不要加入你個人的想法和情...
    白語金言閱讀 151評論 0 0

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