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