摘要:對(duì)象的設(shè)計(jì)目的有幾個(gè)?,F(xiàn)階段,某些方法同時(shí)在喝對(duì)象上部署,未來(lái)的新方法將只部署在對(duì)象上。修改某些方法的返回結(jié)果,讓其變得更合理。它采用方法將值賦值給對(duì)象的屬性,確保完成原有的行為,然后再部署額外的功能。
Reflect
概述。
Relflect對(duì)象與Proxy對(duì)象一樣,也是ES6為了操作對(duì)象而提供的新的API。Reflect對(duì)象的設(shè)計(jì)目的有幾個(gè)。
(1)將Object對(duì)象的一些明顯屬于語(yǔ)言內(nèi)部的方法(比如Obejcet.defineProperty),放到Reflect對(duì)象上?,F(xiàn)階段,某些方法同時(shí)在Object喝Reflect對(duì)象上部署,未來(lái)的新方法將只部署在Reflect對(duì)象上。也就是說(shuō),從reflect對(duì)象上可以拿到語(yǔ)言內(nèi)部的方法。
(2)修改某些Object方法的返回結(jié)果,讓其變得更合理。比如,Object.defineProperty(obj,name,desc)在無(wú)法定義屬性時(shí),會(huì)拋出一個(gè)錯(cuò)誤,而Reflect.defineProperty(obj,name,desc)則會(huì)返回false。
//老寫法 try{ Object.defineProperty(target,property,attributes); //success }catch(e){ //failure } //新寫法 if(Reflect.defineProperty(target,property,attributes)){ //success }else{ //failure }
(3)讓Object操作都變成函數(shù)行為。某些Object操作是命令式,比如name in obj和delete obj[name],而Reflect.has(obj,name)和Reflect.deleteProperty(obj,name)讓它們變成了函數(shù)行為。
//老寫法 "assign" in Object//true //新寫法 Reflect.has(Object,"assign")//true
(4)Reflect對(duì)象的方法與Proxy對(duì)象的方法一一對(duì)應(yīng),只要是Proxy對(duì)象的方法,就能在Reflect對(duì)象上找到對(duì)應(yīng)的方法。這就讓Proxy對(duì)象可以方便地調(diào)用對(duì)應(yīng)的Reflect方法,完成默認(rèn)行為,作為修改行為的基礎(chǔ)。也就是說(shuō),不管Proxy怎么修改默認(rèn)行為,你總可以在Reflect上獲取默認(rèn)行為。
Proxy(target, { set: function(target, name, value, receiver) { var success = Reflect.set(target,name, value, receiver); if (success) { console.log("property " + name + " on " + target + " set to " + value); } return success; } });
上面代碼中,Proxy方法攔截target對(duì)象的屬性賦值行為。它采用Reflect.set方法將值賦值給對(duì)象的屬性,確保完成原有的行為,然后再部署額外的功能。
下面是另一個(gè)例子。
var loggedObj = new Proxy(obj, { get(target, name) { console.log("get", target, name); return Reflect.get(target, name); }, deleteProperty(target, name) { console.log("delete" + name); return Reflect.deleteProperty(target, name); }, has(target, name) { console.log("has" + name); return Reflect.has(target, name); } });
上面代碼中,每一個(gè)Proxy對(duì)象的攔截操作(getdeletehas),內(nèi)部都調(diào)用對(duì)應(yīng)的Reflect方法,保證原生行為能夠正常執(zhí)行。添加的工作,就是將每一個(gè)操作輸出一行日志。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/101708.html
摘要:出現(xiàn)的目的把對(duì)象中的一些明顯屬于語(yǔ)言內(nèi)部的方法,放到對(duì)象上,比如。修改某些方法的返回結(jié)果,讓其變得合理。在無(wú)法定義屬性時(shí),會(huì)拋出一個(gè)錯(cuò)誤,而則會(huì)返回讓操作變成函數(shù)行為。某些操作時(shí)命令式的比如和,而和讓他們變成函數(shù)行為。 Reflect出現(xiàn)的目的 1.把Object對(duì)象中的一些明顯屬于語(yǔ)言內(nèi)部的方法,放到Reflect對(duì)象上,比如Object.defineProperty。就是說(shuō)可以把R...
摘要:概述反射說(shuō)起來(lái)和上一章節(jié)的代理基本一樣,只是使用的方式不同,設(shè)計(jì)理念也不同。 0x000 概述 反射說(shuō)起來(lái)和上一章節(jié)的代理基本一樣,只是使用的方式不同,設(shè)計(jì)理念也不同。 反射提供了一系列的靜態(tài)函數(shù),可以使用Reflect.function_name(...prams)調(diào)用,這一系列的方法和代理的處理器對(duì)象方法一致 0x001 apply 語(yǔ)法 Reflect.apply(targ...
摘要:是中新增的特性。首先來(lái)說(shuō),的提出是為了整合之前中存在的一些不太合理的地方。表示當(dāng)前對(duì)象是否可擴(kuò)展,返回一個(gè)布爾值。更完美的枚舉很多代碼使用字符串普通或凍結(jié)的對(duì)象作為枚舉。通過記錄這些訪問和修改信息,能記錄下對(duì)這個(gè)對(duì)象的所有操作記錄。 Reflect Reflect 是ES6中新增的特性。它是一個(gè)普通對(duì)象,下面有13個(gè)靜態(tài)方法(enumerate在最終的發(fā)布版中被移除),可以再全局下訪問...
摘要:攔截實(shí)例作為構(gòu)造函數(shù)調(diào)用的操作,比如。方法等同于,這提供了一種不使用,來(lái)調(diào)用構(gòu)造函數(shù)的方法。方法對(duì)應(yīng),返回一個(gè)布爾值,表示當(dāng)前對(duì)象是否可擴(kuò)展。這是的一個(gè)提案,目前轉(zhuǎn)碼器已經(jīng)支持。別名或修飾器在控制臺(tái)顯示一條警告,表示該方法將廢除。 Proxy Proxy 這個(gè)詞的原意是代理,用在這里表示由它來(lái)代理某些操作,可以譯為代理器,即用自己的定義覆蓋了語(yǔ)言的原始定義。ES6 原生提供 Proxy...
摘要:查找并返回對(duì)象的屬性例例屬性部署了讀取函數(shù)返回的是的參數(shù)對(duì)象注意如果的第一個(gè)參數(shù)不是對(duì)象,則會(huì)報(bào)錯(cuò)。它返回一個(gè)布爾值,表示是否操作成功用于返回對(duì)象的所有屬性使用和實(shí)現(xiàn)觀察者模式請(qǐng)參考觀察者模式 1、什么是Reflect?為操作對(duì)象而提供的新API 2、為什么要設(shè)計(jì)Reflect?(1)將Object對(duì)象的屬于語(yǔ)言內(nèi)部的方法放到Reflect對(duì)象上,即從Reflect對(duì)象上拿Object...
閱讀 2113·2021-11-08 13:14
閱讀 3020·2021-10-18 13:34
閱讀 2116·2021-09-23 11:21
閱讀 3685·2019-08-30 15:54
閱讀 1908·2019-08-30 15:54
閱讀 3007·2019-08-29 15:33
閱讀 2682·2019-08-29 14:01
閱讀 2036·2019-08-29 13:52