成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

ES6 Proxy/Reflect 淺析

Juven / 2030人閱讀

摘要:即必須有返回值其中可接受三個(gè)參數(shù),為目標(biāo)對(duì)象,為屬性名,為實(shí)際接受的對(duì)象,默認(rèn)為本例中新建的,如果多帶帶指出一個(gè)對(duì)象,可使指出對(duì)象受到相同的方法作用。且中的必須有返回值,的不用,這也正是因?yàn)樵谒筮€會(huì)執(zhí)行所以不需要。

ES6 Proxy/Reflect Proxy 攔截器

proxy是es6的新特性,簡(jiǎn)單來講,即是對(duì)目標(biāo)對(duì)象的屬性讀取、設(shè)置,亦或函數(shù)調(diào)用等操作進(jìn)行攔截(處理)。

let proxy = new Proxy(target,handle)
target

一個(gè)proxy代理對(duì)象由兩部分組成target/handle。其中target為目標(biāo)對(duì)象,可以為一個(gè)空對(duì)象即(target={}),也可以是一個(gè)含有屬性和方法的對(duì)象(target={foo:1,bar:2}),在進(jìn)行l(wèi)et proxy=new Proxy(target,handle)的操作后,新的proxy對(duì)象會(huì)對(duì)target進(jìn)行“淺拷貝”,即proxy、target兩個(gè)對(duì)象會(huì)相互影響。即:

let target = { _prop: "foo", prop: "foo" };
let proxy = new Proxy(target, handler);
proxy._prop = "bar";
target._attr = "new"
console.log(target._prop) // "bar"
console.log(proxy._attr) //"new"
ES5 getter/setter

handle是實(shí)際運(yùn)行的處理方法,Proxy的handle一共有13種方法,以最簡(jiǎn)單常用的get/set方法為例。在ES5中,對(duì)象就有g(shù)et/set的訪問器(低版本瀏覽器不支持),它們的作用是在對(duì)象進(jìn)行屬性的讀寫時(shí),進(jìn)行額外的操作。例如person對(duì)象下的age屬性,當(dāng)它不在0-100之間時(shí),給這個(gè)age的值重置為0。

var person = {
                get age(){
                    console.log("getter")
                    return this._age;//這里千萬不能return this.age,會(huì)出錯(cuò)
                },
                set age(val) {
                    console.log("setter")
                    this._age = val < 100 && val > 0 ? val:0
                   
                }
            };
    person.age = 10 //10
    person.age = 101 //0
    person.age = "age" //0

在進(jìn)行賦值操作時(shí),會(huì)先觸發(fā)set、后觸發(fā)get,進(jìn)行如person.age++的操作時(shí),set、get的觸發(fā)順序?yàn)椋篻et=>set。以上就是ES5的getter/setter訪問器。

handle

在 Proxy中的handle中g(shù)et、set方法也類似。即

   let handler = {
                get (target, key){
                    return target[key]
                },
                set (target, key, value) {
                    if (key === "age") {
                        target[key] = value > 0 && value < 100 ? value : 0
                    }
                    return true;//必須有返回值
                }
            };

            let target = {};
            let proxy = new Proxy(target, handler);
            proxy.age = 22 //22

其中g(shù)et可接受三個(gè)參數(shù)(target,key, receiver),target為目標(biāo)對(duì)象,key為屬性名,receiver為實(shí)際接受的對(duì)象,默認(rèn)為本例中新建的proxy,如果多帶帶指出一個(gè)對(duì)象,可使指出對(duì)象受到相同的方法作用。例如:

   let _proxy={};
   let handler = {
                get (target, key , receiver){
                    receiver=_proxy;
                    target[key]="test";
                    return Reflect.get(target,key,receiver);
                },
                set (target, key, value) {
                    if (key === "age") {
                        target[key] = value > 0 && value < 100 ? value : 0
                    }
                    return true;//必須有返回值
                }
            };

            let target = {};
            let proxy = new Proxy(target, handler);
            proxy.age
            console.log(_proxy.age) // test

set方法 多一個(gè)value參數(shù),為屬性值,即 proxy.age=1,中的1。

與ES5 setter/getter訪問器的區(qū)別是,在proxy中,proxy.age=1,只會(huì)執(zhí)行 set的方法,而不是像ES5中的setter,會(huì)先執(zhí)行set,后執(zhí)行g(shù)et。且proxy中的set必須有返回值,ES5的setter不用,這也正是因?yàn)樵谒筮€會(huì)執(zhí)行g(shù)etter,所以不需要。

Reflect 反射

Reflect與ES5的Object有點(diǎn)類似,包含了對(duì)象語言內(nèi)部的方法,Reflect也有13種方法,與proxy中的方法一一對(duì)應(yīng)。Proxy相當(dāng)于去修改設(shè)置對(duì)象的屬性行為,而Reflect則是獲取對(duì)象的這些行為。
還是剛才的例子:

 let _proxy = {}
 let handler = {
                get (target, key,recive){
                    return Reflect.get(target,key,recive)
                },
                set (target, key, value) {
                    if (key === "age") {
                        target[key] = value > 0 && value < 100 ? value : 0
                    }
                    return Reflect.set(target,key,value,_proxy);
                }
            };

  let target = {};
  let proxy = new Proxy(target, handler);
  proxy.age = 33
  console.log(_proxy.age)//33

Reflect 也可與ES5的setter/getter配合使用,例如:

var myObject = {
  foo: 1,
  bar: 2,
  get baz() {
    return this.foo + this.bar;
  },};

var myReceiverObject = {
  foo: 4,
  bar: 4,};

Reflect.get(myObject, "baz", myReceiverObject) // 8

其余方法與Proxy均相同,區(qū)別即是,設(shè)置和獲取的關(guān)系。

Proxy和Reflect還有很多方法,比如apply作為操作對(duì)象函數(shù)時(shí)觸發(fā)的方法,比如myObject =function(){
return "it"s Fn"}, myObject();會(huì)觸發(fā)handle中的apply方法。還有觸發(fā)has方法的_attr in obj等等共計(jì)13種方法,本次只以最簡(jiǎn)單的set、get方法來舉例。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/81483.html

相關(guān)文章

  • ES6學(xué)習(xí)筆記4-Proxy、Reflect、Decorator、Module

    摘要:攔截實(shí)例作為構(gòu)造函數(shù)調(diào)用的操作,比如。方法等同于,這提供了一種不使用,來調(diào)用構(gòu)造函數(shù)的方法。方法對(duì)應(yīng),返回一個(gè)布爾值,表示當(dāng)前對(duì)象是否可擴(kuò)展。這是的一個(gè)提案,目前轉(zhuǎn)碼器已經(jīng)支持。別名或修飾器在控制臺(tái)顯示一條警告,表示該方法將廢除。 Proxy Proxy 這個(gè)詞的原意是代理,用在這里表示由它來代理某些操作,可以譯為代理器,即用自己的定義覆蓋了語言的原始定義。ES6 原生提供 Proxy...

    lushan 評(píng)論0 收藏0
  • 【資源集合】 ES6 元編程(Proxy & Reflect & Symbol)

    摘要:理解元編程和是屬于元編程范疇的,能介入的對(duì)象底層操作進(jìn)行的過程中,并加以影響。元編程中的元的概念可以理解為程序本身。中,便是兩個(gè)可以用來進(jìn)行元編程的特性。在之后,標(biāo)準(zhǔn)引入了,從而提供比較完善的元編程能力。 導(dǎo)讀 幾年前 ES6 剛出來的時(shí)候接觸過 元編程(Metaprogramming)的概念,不過當(dāng)時(shí)還沒有深究。今天在應(yīng)用和學(xué)習(xí)中不斷接觸到這概念,比如 mobx 5 中就用到了 Pr...

    aikin 評(píng)論0 收藏0
  • ES6Proxy & Reflection API

    摘要:的出現(xiàn),使用內(nèi)建對(duì)象的繼承得以實(shí)現(xiàn)。屬性不存在拋出異常是取值操作,而就是賦值操作,可以對(duì)屬性值進(jìn)行驗(yàn)證。屬性必須為數(shù)字拋出異常接受兩個(gè)參數(shù)被讀取屬性的原對(duì)象,即代理的目標(biāo)。這個(gè)可以攔截內(nèi)部方法,通過返回?cái)?shù)組的值可以覆寫其行為。 Proxy & Reflect extends的出現(xiàn),使用內(nèi)建對(duì)象的繼承得以實(shí)現(xiàn)。Proxy可以攔截JS引擎內(nèi)部目標(biāo)的底層對(duì)象操作,這些底層操作被攔截后會(huì)觸發(fā)響...

    yearsj 評(píng)論0 收藏0
  • 初入ES6-ProxyReflect

    摘要:用于修改某些操作的默認(rèn)行為和訪問器屬性的行為類似在對(duì)象的前面多一層代理,對(duì)象字面量中定義屬性的特性方法,訪問器屬性此時(shí)屬性被定義為訪問器屬性不一樣的寫法中是用代理的寫法第一個(gè)參數(shù)是對(duì)象,第二個(gè)是要操作的方法對(duì)象也有兩個(gè)屬性,一個(gè)是目標(biāo)對(duì)象, 1,Proxy用于修改某些操作的默認(rèn)行為和訪問器屬性的行為類似,在對(duì)象的前面多一層代理, const obj = { ...

    BakerJ 評(píng)論0 收藏0
  • 初識(shí)Proxy、Reflect

    摘要:主要原因應(yīng)該是在處理數(shù)組響應(yīng)是會(huì)存在缺陷。構(gòu)造函數(shù)其中表示生成一個(gè)實(shí)例,為需要代理的對(duì)象,則是一個(gè)對(duì)象,定義了各種代理行為。對(duì)于滿足條件的屬性以及其他屬性,直接保存報(bào)錯(cuò)報(bào)錯(cuò)攔截的操作,返回一個(gè)布爾值。 前言 https://segmentfault.com/a/11... Vue3.0應(yīng)該馬上就要發(fā)布正式版了。聽說在新版本中,Proxy取代了Object.defineProperty進(jìn)...

    gougoujiang 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<