js--代理和反射进阶

前言

  前面已经了解了代理的创建、代理的处理程序,捕获器和常见的反射API,那么结合这些知识,在开发中能实现哪些代码方面的便捷和优化。

正文

  1、使用 get() 和set() 捕获器跟踪对象属性的设置和访问

        var person = {}
        var handler = {
            set(trapTarget, property, value, receiver) {
                console.log(`Setting ${property} ${value}`);
                return Reflect.set(...arguments);
            },
            get(trapTarget, property, receiver) {
                console.log(`Getting ${property}`);
                return Reflect.get(...arguments);
            }
        }
        var proPerson = new Proxy(person, handler)
        proPerson.name = "Serendipity"// Setting name Serendipity
        console.log(proPerson.name);//Getting name Serendipity

  2、组合get() 和has() 捕获器实现隐藏属性

        var person = {
            name: "Serendipity",
            age: 18
        }
        var handler = {
            get(target, property, receiver) {
                if (property == "age") {
                    return undefined
                } else {
                    return Reflect.get(...arguments);
                }
            },
            has(target, property) {
                if (property == "age") {
                    return false
                } else {
                    return Reflect.has(...arguments);
                }
            }
        }
        var proPerson = new Proxy(person, handler)
        console.log(proPerson.name);// Serendipity
        console.log(proPerson.age);//undefined
        console.log("name" in proPerson);//true
        console.log("age" in proPerson);// false

  3、数据绑定与可观察对象

  通过代理可以把运行时中原本不相关的部分联系到一起。这样就可以实现各种模式,从而让不同的代码互操作。比如,可以将被代理的类绑定到一个全局实例集合,让所有创建的实例都被添加到这个集合中。

        const userList = [];
        class User {
            constructor(name) {
                this.name_ = name;
            }
        }
        const proxy = new Proxy(User, {
            construct() {
                const newUser = Reflect.construct(...arguments);
                userList.push(newUser);
                return newUser;
            }
        });
        new proxy('John');
        new proxy('Jacob');
        new proxy('Jingleheimerschmidt');
        console.log(userList); // [User {}, User {}, User{}]
        // 另外,还可以把集合绑定到一个事件分派程序,每次插入新实例时都会发送消息:
        const userList = [];
        function emit(newValue) {
            console.log(newValue);
        }
        const proxy = new Proxy(userList, {
            set(target, property, value, receiver) {
                const result = Reflect.set(...arguments);
                if (result) {
                    emit(Reflect.get(target, property, receiver));
                }
                return result;
            }
        });
        proxy.push('John');// John
        proxy.push('Jacob');// Jacob

写在最后

  以上就是本文的全部内容,希望给读者带来些许的帮助和进步,方便的话点个关注,小白的成长之路会持续更新一些工作中常见的问题和技术点。

posted @ 2022-01-13 15:23  zaisy'Blog  阅读(64)  评论(0编辑  收藏  举报