先上代碼:
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)部變量,如果是就禁止操作。