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 @   zaisy'Blog  阅读(69)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
点击右上角即可分享
微信分享提示