回覆列表
  • 1 # 使用者2245398384886

    基本概念

    字面意思的理解就是代理。

    用於定義基本操作的自定義行為,就是我們可以自定義某些行為,比如屬性的查詢,賦值,列舉,函式呼叫等。

    實際上我們利用這個Proxy實現對程式語言進行程式設計,就是把一些內部的方式,內建的方法改變了,這種程式設計就叫做語言程式設計。屬性代理就做攔截。

    關於Proxy需要注意的地方有:Proxy內部的this關鍵字的指向是Proxy代理本身;它的構建方式需要藉助一個Proxy的建構函式new Proxy(target,handler),其中target叫做目標物件,Proxy建構函式返回的是一個包裝過後的目標物件,handler是代理的行為的函式。

    代理操作

    , 攔截某個屬性的讀取操作,接收三個引數:target(目標物件)、property(屬性名)、receiver(一般是Proxy物件本身,可選引數)

    get屬性攔截可以繼承,需要注意的一點是,當某個物件不可配置(configurable)或者不可寫(writable),使用get會報錯。

    , 攔截某個屬性的賦值操作 set屬性有四個引數:target(目標物件)、property(屬性名)、value(屬性值)、receiver(Proxy例項本身,可選引數)

    同樣的,在不可配置(configurable),不可寫(writable)的裡面,使用set不生效。

    , 函式呼叫、call和apply攔截 apply接收三個引數:target(目標物件)、thisArg(目標物件this)、argumentsList(目標物件引數陣列) , 攔截物件是否具有某個屬性 - hasProperty has有兩個引數:target(目標物件)、prop(查詢的屬性名)。返回一個布林值,true or false。

    注意的點:has不攔截for in迴圈;物件不可配置(configurable)時,使用has會報錯。

    , 攔截new運算子 construct接收三個引數:target(目標物件)、argumentsList(建構函式引數)、newTarget(最初被呼叫的建構函式,為了方便能夠得到原來建構函式想要得到的結構)。

    注意:返回值必須是物件。

    , 攔截屬性遍歷 own只有一個引數:target(目標物件)。 , 攔截刪除操作 deleteProperty接收兩個引數:target(目標物件)、property(刪除的屬性名)。物件不可配置(configurable),使用deleteProperty會報錯 , 攔截Object.defineProperty defineProperty接收三個引數:target(目標物件)、property(屬性名)、descriptor(描述樹)。屬性不可擴充套件(non-extensible)會報錯,不可配置(configurable)或者不可寫(writable)使用defineProperty不生效。 , 攔截Object.getOwnPropertyDescriptor getOwnPropertyDescriptor接收兩個引數:target(目標物件)、prop(屬性名稱)。, 攔截獲取物件原型 getPrototypeOf 接收一個引數:target (目標物件)。必須返回物件或null。 , 攔截Object.isExtensible getPrototypeOf 接收一個引數:target (目標物件)。必須返回布林值。, 攔截Object.preventExtensions preventExtensions 接收一個引數:target (目標物件)。必須返回一個布林值。, 攔截Object.setPrototypeOf setPrototypeOf 接收兩個引數:target (目標物件)、proto (原型物件)。

    設定代理之後如何得到預設的行為?有兩種方式,一種是Proxy代理取消,另一種是使用reflect。

    Proxy代理取消

    內部提供的方法:revocable

  • 中秋節和大豐收的關聯?
  • 車險在4s店定損後在別處維修可以嗎?