前端学习

ES6中利用神器Proxy实现私有变量.md

2018-06-19  本文已影响0人  傲娇的泰迪

先上代码:

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上
在此例中,相当于先判断你要操作的变量是不是内部变量,如果是就禁止操作。
上一篇下一篇

猜你喜欢

热点阅读