Proxy
Proxy用于修改某些操作的默認行為轻要,等同于在語言層面作出修改,所以屬于一種“元編程”懂版,即對編程語言進行編程
ES6原生提供Proxy構(gòu)造函數(shù)潭千,用來生成Proxy實例
var proxy = newProxy(target,handler);
new Proxy()表示生成一個Proxy實例衩侥。target參數(shù)是索要攔截的目標對象国旷,handler參數(shù)也是一個對象,用來定制攔截行為
注意茫死,要使得Proxy起作用跪但,必須針對Proxy實例進行操作,而不是針對目標對象峦萎。
如果handler沒有設置任何攔截屡久,那就等同于直接通向原對象
下面是Proxy支持的攔截操作一覽,對于可以設置详幽、但沒有設置攔截的操作筛欢,則直接落在目標對象上,按照原先的方式產(chǎn)生結(jié)果
1)get(target唇聘、propKey版姑、receiver)
攔截對象屬性的讀取,比如proxy.foo和proxy['foo']
2)set(target雳灾、propKey漠酿、value、receiver)
攔截對象屬性的設置
3)has(target谎亩,proKey)
攔截propKey in proxy的操作炒嘲,返回一個布爾值
4)deleteProperty(target,propKey)
攔截delete proxy[propKey]的操作匈庭,返回一個布爾值夫凸。
5)ownKeys(target)
攔截Object.getOwnPropertyNames(proxy)、Object.getOwnPropertySymbols(proxy)阱持、Object.keys(proxy)夭拌,返回一個數(shù)組。該方法返回目標對象所有自身的屬性的屬性名衷咽,而Object.keys()的返回結(jié)果僅包括目標對象自身的可遍歷屬性鸽扁。
6)getOwnPropertyDescriptor(target,propKey)
攔截Object.getOwnPropertyDescriptor(proxy, propKey),返回屬性的描述對象镶骗。
7)defineProperty(taget桶现,propKey,propDesc)
攔截Object.defineProperty(proxy, propKey, propDesc)鼎姊、Object.defineProperties(proxy, propDescs)骡和,返回一個布爾值。
8)preventExtensions(target)
攔截Object.preventExtensions(proxy)相寇,返回一個布爾值慰于。
(9)getPrototypeOf(target)
攔截Object.getPrototypeOf(proxy),返回一個對象唤衫。
(10)isExtensible(target)
攔截Object.isExtensible(proxy)婆赠,返回一個布爾值。
(11)setPrototypeOf(target, proto)
攔截Object.setPrototypeOf(proxy, proto)佳励,返回一個布爾值休里。
如果目標對象是函數(shù),那么還有兩種額外操作可以攔截植兰。
(12)apply(target, object, args)
攔截 Proxy 實例作為函數(shù)調(diào)用的操作份帐,比如proxy(...args)、proxy.call(object, ...args)楣导、proxy.apply(...)废境。
(13)construct(target, args)
攔截 Proxy 實例作為構(gòu)造函數(shù)調(diào)用的操作,比如new proxy(...args)筒繁。
Proxy實例的方法
get()方法用于攔截某個屬性的讀取操作噩凹。
3、Proxy.revocable()
Proxy.revocable方法返回一個可取消的Proxy實例
4毡咏、this問題
5驮宴、實例web服務的客戶端
Reflect
1)reflect對象與Proxy對象一樣,也是ES6為了操作對象而提供的心API
2)靜態(tài)方法呕缭,大部分與object對象的同名方法的作用都是相同堵泽,而且它與Proxy對象的方法是一一對應的修己。
3)Reflect.apply(target,thisArg,args) ?這個方法等同于Function.prototype.apply.call(funnc,thisArg,args),用于綁定this對象對象后執(zhí)行給定函數(shù)
4)Reflect.construct(target,args) ? 這個方法等同于new target(...args),這提供了一種不使用new來吊桶構(gòu)造函數(shù)的方法
5)Reflect.get(target,name,receiver)查找并返回target對象的name屬性,如果沒有該屬性迎罗,則返回undefined睬愤。如果第一個參數(shù)不是對象,Reflect.get方法會報錯
6)Reflect.set(target,name,value,receiver) Reflect.set方法設置target對象的name屬性等于value
Reflect.set與Reflect.get一樣纹安,如果第一個參數(shù)不是對象尤辱,它會報錯
注意Reflect.set會出發(fā)Proxy.defineProperty攔截
7)Reflect.defineProperty(target,name,desc) 這個方法等用于Object.defineProperty,用來為對象定義屬性。未來后者被逐漸剔除
8)Reflect.deleteProperty(target,name) ? 用于刪除對象的屬性 等同于 delete obj[name]
9)Reflect.has(target,name) ? ? 對應name in obj里面的in運算符
Reflect.ownKeys(target) ?基本等同于Object.getOwnPropertyNames與Object.getOwnPropertySymbols之和厢岂。
Reflect.isExtensible(target) ?這個方法對應Object.preventExtensions方法光督,用于讓一個對象編程不可擴展。它返回一個布爾值塔粒,表示是否操作成功
Reflect.preventExtensions(target)
Reflect.getOwnPropertyDescriptor(target, name) 這個方法等同于Object.getOwnPropertyDescriptor用于得到指定屬性的描述對象
Reflect.getPrototypeOf(target) ?用于讀取對象的_proto_屬性结借,對應Object.getPrototypeof(obj)
Reflect.getPrototypeOf和Object.getPrototypeof的一個區(qū)別是,如果參數(shù)不是對象窗怒,Object.getProrypeOf會將這個參數(shù)轉(zhuǎn)為對象映跟,然后再運行,但是Reflect.getPrototypeof會報錯
Reflect.setPrototypeOf(target, prototype) 用于設置對象的_proto_屬性扬虚,返回第一個參數(shù)對象努隙,對應Object.setPrototypefOf(obj)