ES6中利用神器Proxy實(shí)現(xiàn)私有變量.md

先上代碼:

const protectHandler = {    //此為定義Proxy的第二個(gè)參數(shù),劫持原對(duì)象的get和set方法
    get (target, key) {    //target為目標(biāo)對(duì)象, key為成員變量
        isProtected(key, 'get');    //調(diào)用isProtected判斷是否合法
        return target[key];    //如果合法會(huì)運(yùn)行此步,返回目標(biāo)對(duì)象中的成員變量
    },
    set (target, key, value) {    //value為要給成員變量設(shè)置的值
        isProtected(key, 'set');
        target[key] = value;    //如果合法會(huì)運(yùn)行此步,設(shè)置變量值為value
        return true;    //成功返回true
};
function isProtected (key, action) {    //判斷是否合法的函數(shù)
    if (key[0] === '_') {    //規(guī)定:如果成員變量名以"_"開頭,就視為私有的,拋出異常阻止操作
        throw new Error(`Invalid attempt to ${action} private "${key}" property`);
    }
}
const yourObj = new Student();    //實(shí)例化一個(gè)對(duì)象
const myObj = new Proxy(yourObj, protectHandler);//給yourObj對(duì)象添加protectHandler劫持,
                                                 //在set和get時(shí)遇到以"_"開頭的私有變量名就報(bào)錯(cuò)

解釋:

Proxy(target, handler)
target指的是你實(shí)例化的一個(gè)類,handler是你定義的劫持規(guī)則
const myObj = new Proxy(target, handler)
此時(shí)對(duì)myObj的get,set操作相當(dāng)于先通過(guò)handler,再作用到target上
在此例中,相當(dāng)于先判斷你要操作的變量是不是內(nèi)部變量,如果是就禁止操作。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容