先上代码:
const protectHandler = { //此为定义Proxy的第二个参数,劫持原对象的get和set方法
get (target, key) { //target为目标对象, key为成员变量
isProtected(key, 'get'); //调用isProtected判断是否合法
return target[key]; //如果合法会运行此步,返回目标对象中的成员变量
},
set (target, key, value) { //value为要给成员变量设置的值
isProtected(key, 'set');
target[key] = value; //如果合法会运行此步,设置变量值为value
return true; //成功返回true
};
function isProtected (key, action) { //判断是否合法的函数
if (key[0] === '_') { //规定:如果成员变量名以"_"开头,就视为私有的,抛出异常阻止操作
throw new Error(`Invalid attempt to ${action} private "${key}" property`);
}
}
const yourObj = new Student(); //实例化一个对象
const myObj = new Proxy(yourObj, protectHandler);//给yourObj对象添加protectHandler劫持,
//在set和get时遇到以"_"开头的私有变量名就报错
解释:
Proxy(target, handler)
target指的是你实例化的一个类,handler是你定义的劫持规则
const myObj = new Proxy(target, handler)
此时对myObj的get,set操作相当于先通过handler,再作用到target上
在此例中,相当于先判断你要操作的变量是不是内部变量,如果是就禁止操作。
网友评论