ES6 Proxy的基本使用

 //目标对象
        let p = {
            name: "令狐狐冲",
            age: 18,
            __skill__: "独孤九剑"
        }
        //创建代理对象
        let proxy = new Proxy(p, {
            //对姓名做屏蔽操作 令狐狐冲=>令**冲
            //拦截对象属性的读取操作
            get(target, key) {
                if (key === "name") {
                    var name = target[key]
                    var array = name.split("")
                    //"**"
                    var replaceStr = "*".repeat(name.length - 2 < 0 ? 0 : name.length - 2)
                    //数组元素的替换 **=>*,* 
                    array.splice(1, array.length - 2, ...replaceStr)
                    return array.join("")
                }
            },
            //拦截对象属性的赋值操作
            set(target, key, value) {
                if (key[0] === "_") {
                    throw new Error(`设置"${key}"属性无效`)
                }
                target[key] = value
                return true
            },
            //拦截判断对象是否具有某个属性 in
            has(target, key) {
                if (key[0] === "_") {
                    return false
                }
                return key in target
            },
            //拦截delete操作
            deleteProperty(target, key) {
                if (key[0] === "_") {
                    delete target[key]
                    return true
                } else {
                    return false
                }
            },
            //拦截对象自身属性的读取操作。
            //for...in、object.keys()、object.getOwnPropertySymbols()..
            ownKeys(target) {
                return Object.keys(target).filter(key => key[0] !== "_")
            }

        })
        //直接读取目标对象的属性
        console.log(p.name)
        //通过代理对象读取目标对象的属性,增加的名称信息屏蔽的操作
        console.log(proxy.name)

        // p.__skill__="华山剑法"
        // console.log(p)
        proxy.age = 28
        console.log("proxy", proxy)

        // proxy.__skill__ = "华山剑法"
        // console.log("proxy", proxy)
        console.log("__skill__" in p)
        console.log("__skill__" in proxy)

        for (let key in proxy) {
            console.log(key)
        }

        // delete proxy.__skill__
        // console.log("proxy", proxy)

        // delete proxy.name
        // console.log("proxy", proxy)


posted @ 2021-02-25 18:31  abcdefgab  阅读(94)  评论(0)    收藏  举报