ES--6Proxy和Reflect

proxy代理

將原始數(shù)據(jù)代理档冬,不能修改原始數(shù)據(jù),通過代理的方式去修改數(shù)據(jù)。

{
    let obj={
        time:'2017-3-11',
        name:"net",
        _r:123
    };
    let monitor=new Proxy(obj,{
        //攔截對(duì)象屬性的讀取
        get(target,key){
            return target[key].replace('2017','2018')
        },
        //攔截對(duì)象設(shè)置屬性
        set(target,key,value){
            if(key=='name'){
                return target[key]=value
            }else {
                return target[key]
            }
        },
        //攔截key in obj
        has(target,key){
            if(key==='name'){
                return target[key]
            }else{
                return false;
            }
        },
        //攔截delete
        deleteProperty(target,key){
            if(key.indexOf('_')>-1){
                delete target[key];
                return true;
            }else{
                return target[key]
            }
        },
        //攔截Object.keys,Object.getOwnPropertySymbols,Object.getOwnPropertyNames
        ownKeys(target){
            return Object.keys(target).filter(item=>item!='time')
        }
    });
    console.log(Object.keys(monitor))
    //["name", "_r"]
    //monitor
    console.log(monitor.time)
    // 2018-3-11
/*    monitor.time='2018';
    monitor.name='3333';*/
    console.log(monitor.time)
    //2018-3-11
    console.log(monitor)
    //Proxy {time: "2017-3-11", name: "3333", _r: 123}
    console.log('name' in monitor , 'time' in monitor)
    //true false
    delete monitor.time;
    console.log(monitor)
    //Proxy {time: "2017-3-11", name: "net", _r: 123}
    delete monitor._r;
    console.log(monitor)
    //Proxy {time: "2017-3-11", name: "net"}
}

Reflect

{
    let obj={
        time:'2017-3-11',
        name:"net",
        _r:123
    };
    console.log(Reflect.get(obj,'time'))
    //2017-3-11
    Reflect.set(obj,'name','re')
    console.log(obj)
    //{time: "2017-3-11", name: "re", _r: 123}
    console.log(Reflect.has(obj,'time'))
    //true
}

應(yīng)用

Proxy可以將業(yè)務(wù)與邏輯更好的分離

{
    function validator(target,validator) {
        return new Proxy(target,{
            _validator:validator,
            set(target,key,value,proxy){
                if(target.hasOwnProperty(key)){
                    let va=this._validator[key];
                    if(!!va(value)){
                        return Reflect.set(target,key,value,proxy)
                    }else{
                        throw Error(`不能設(shè)置${key}到${value}`)
                    }
                }else{
                    throw  Error(`${key} 不存在`)
                }
            }
        })
    }
    const personValidators={
        name(val){
            return typeof val==='string'
        },
        age(val){
            return typeof val==='number'&&val>18
        }
    }
    class Person{
        constructor(name,age){
           this.name=name;
           this.age=age;
           return validator(this,personValidators)
        }
    }
    const person=new Person('liubin',20);
    console.log(person)
    //Proxy {name: "liubin", age: 20}
    //person.name=48;
    //不能設(shè)置name到48
    person.name='48';
    console.log(person)
    //Proxy {name: "48", age: 20}
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末捣郊,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子慈参,更是在濱河造成了極大的恐慌呛牲,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,464評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件驮配,死亡現(xiàn)場(chǎng)離奇詭異娘扩,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)壮锻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門琐旁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人猜绣,你說我怎么就攤上這事灰殴。” “怎么了掰邢?”我有些...
    開封第一講書人閱讀 169,078評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵牺陶,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我辣之,道長(zhǎng)掰伸,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,979評(píng)論 1 299
  • 正文 為了忘掉前任怀估,我火速辦了婚禮狮鸭,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘多搀。我一直安慰自己歧蕉,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,001評(píng)論 6 398
  • 文/花漫 我一把揭開白布康铭。 她就那樣靜靜地躺著廊谓,像睡著了一般。 火紅的嫁衣襯著肌膚如雪麻削。 梳的紋絲不亂的頭發(fā)上蒸痹,一...
    開封第一講書人閱讀 52,584評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音呛哟,去河邊找鬼叠荠。 笑死,一個(gè)胖子當(dāng)著我的面吹牛扫责,可吹牛的內(nèi)容都是我干的榛鼎。 我是一名探鬼主播,決...
    沈念sama閱讀 41,085評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼者娱!你這毒婦竟也來了抡笼?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,023評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤黄鳍,失蹤者是張志新(化名)和其女友劉穎推姻,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體框沟,經(jīng)...
    沈念sama閱讀 46,555評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡藏古,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,626評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了忍燥。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拧晕。...
    茶點(diǎn)故事閱讀 40,769評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖梅垄,靈堂內(nèi)的尸體忽然破棺而出厂捞,到底是詐尸還是另有隱情,我是刑警寧澤队丝,帶...
    沈念sama閱讀 36,439評(píng)論 5 351
  • 正文 年R本政府宣布蔫敲,位于F島的核電站,受9級(jí)特大地震影響炭玫,放射性物質(zhì)發(fā)生泄漏奈嘿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,115評(píng)論 3 335
  • 文/蒙蒙 一吞加、第九天 我趴在偏房一處隱蔽的房頂上張望裙犹。 院中可真熱鬧,春花似錦衔憨、人聲如沸叶圃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,601評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽掺冠。三九已至,卻和暖如春码党,著一層夾襖步出監(jiān)牢的瞬間德崭,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,702評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工揖盘, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留眉厨,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,191評(píng)論 3 378
  • 正文 我出身青樓兽狭,卻偏偏與公主長(zhǎng)得像憾股,于是被迫代替她去往敵國(guó)和親鹿蜀。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,781評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容