美文网首页
代理相关学习

代理相关学习

作者: 怀念小兔 | 来源:发表于2019-01-24 16:42 被阅读3次

代理(Proxy)是ES6中新增的用法,它可以拦截一个对象属性或方法的调用及赋值。
创建代理的方式如下:

let proxy = new Proxy(target, handler);

其中target代表要代理的对象,handler描述了拦截后的行为。
我们首先创建一个对象:

            let sylvilagus = {
                name: "sylvilagus",
                type: "rabbit",
                age: 3,
                jump: function(){
                    console.log(this.name + " is jumping");
                }
            };

对它进行一些赋值和打印属性值的操作:

            console.log("name = " + sylvilagus.name);
            console.log("age = " + sylvilagus.age);
            sylvilagus.jump();

发现可以正常输出预期的结果:


输出了预期结果

现在,我们想添加一个验证,age必须是数字,那么如果在要求不更改原对象的前提下,我们就可以通过代理来完成它:

            let handler = {
                set: function(target, key, value){
                    if(key == "age" && isNaN(value)){
                        console.log("error! the value of property age must be a number!");
                        return;
                    }
                    target[key] = value;
                }
            };
            let proxy = new Proxy(sylvilagus, handler);
            proxy.age = "abc";

执行程序,可以看到控制台输出了我们的拦截提示


设置非数字年龄失败

上面是拦截对象属性的赋值,同样的,读取也可以通过代理来拦截:

                get: function(target, key){
                    return "wrapped" + target[key];
                }

我们拦截了对象属性的读取,让他在原值的基础上加上wrapped前缀,然后输出它的属性值,并且调用它的jump方法:

            console.log("name = " + proxy.name);
            proxy.jump();

执行程序,控制台输出了结果:

输出结果
我们看到,属性的读取得到了我们的预期结果,但方法调用就悲剧了。这是为什么呢?控制台打印一下proxy.jump 注意:不加括号 ,可以发现我们刚才拦截的属性读取影响了它,它也多了个wrapped前缀,影响了方法调用,去掉我们在get中加前缀的逻辑,再次执行程序,发现结果正常。
代理相关的东西暂时先记录这些,它还能拦截方法调用、构造器调用(new)等很多操作,后续有时间的时候再补充,对我而言,暂时知道es6有代理和反射即可,需要时再深入学习。

相关文章

  • 代理相关学习

    代理(Proxy)是ES6中新增的用法,它可以拦截一个对象属性或方法的调用及赋值。创建代理的方式如下: 其中tar...

  • UIScrollView笔记

    UIScrollView相关参数笔记 滑动相关代理方法 放大缩小视图相关代理方法

  • 代理相关

    linux 代理 临时代理 重启失效 永久代理在 /etc/profile (全局)、 ~/.bashrc (...

  • 代理模式总结

    代理模式概念: 相关角色:代理接口(Subject);代理类(ProxySubject);委托类(RealSubj...

  • java动态代理

    最近学习asm框架顺便复习了下动态代理的相关知识,这里简单做一下记录。java中动态代理注意通过proxy的new...

  • Curl 代理相关

    CURLOPT_HTTPPROXYTUNNEL启用 HTTP 代理通道,针对 HTTP 代理服务器。在未启用时 C...

  • NSURLSession相关代理

    相关枚举 NSURLSessionDelegate 相关 定义URL会话实例调用其委托来处理会话级事件(如会话生命...

  • CentOS7-Nginx安装及动态新增模块安装笔记

    说明: 因为后续的相关的Python web需要依赖于nginx做相关的反向代理和负载均衡,所以我们的这里需要学习...

  • Java静态代理与动态代理

    前言 最近在学习设计模式,个人觉得代理模式比较重要,就在网上找了很多代理模式相关的知识点,总结如下,希望可以帮到有...

  • UITableView 索引

    索引的相关属性设置: 实现tableView索引相关的代理

网友评论

      本文标题:代理相关学习

      本文链接:https://www.haomeiwen.com/subject/uzqujqtx.html