一、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è)置成功