美文网首页
JavaScript设计模式之代理模式

JavaScript设计模式之代理模式

作者: w候人兮猗 | 来源:发表于2019-01-16 22:33 被阅读0次

介绍

  • 使用者无权直接访问目标对象
  • 中间使用代理,通过代理的方式做授权和控制

实例

  • 科学上网
  • 明星经纪人

UML

image

代码演示

        class RealImg{
        constructor(fileName){
            this.fileName = fileName;
            this.loadFromDisk()
        }

        display(){
            console.log('display.....'+ this.fileName)
        }

        loadFromDisk(){
            console.log('from disk.....'+ this.fileName)
        }

    }

    class ProxyImg{
        constructor(fileName){
            this.realImg = new RealImg(fileName);
        }
        display(){
            this.realImg.display()
        }
    }

    //测试
    let proxyImg = new ProxyImg('1.png')
    proxyImg.display()

场景

  • 网页事件代理
  • Es6 Proxy
  • jQ $.proxy

网页事件代理

    <div id="div1">
        <a href="#">a1</a>
        <a href="#">a2</a>
        <a href="#">a3</a>
        <a href="#">a4</a>
        <a href="#">a5</a>
    </div>
     var div1 = document.getElementById('div1');
    div1.addEventListener('click',function (e) {
        var target = e.target
        if(target.nodeName ==='A'){
            alert(target.innerHTML)
        }
    })

jQ $.proxy

    <div id="div1">
        <a href="#">a1</a>
        <a href="#">a2</a>
        <a href="#">a3</a>
        <a href="#">a4</a>
        <a href="#">a5</a>
    </div>
     $('#div1').click(function () {
       var _this = this
       setTimeout(function () {
           //直接$(this) 的话当前this 不是 $('#div1')
           $(_this).addClass('red')
       },1000)
   })

    //使用代理
   $('#div1').click(function () {
       setTimeout($.proxy(function () {
           //直接$(this) 的话当前this 不是 $('#div1')
           $(this).addClass('red')
       },this),1000);
   })

ES6 Proxy

     //定义一个real 对象
    let star = {
        name:'w候人兮猗',
        age:22,
        phone:'15955041111'
    }
    //定义一个代理
    let agent = new Proxy(star,{
        get:function (target,key) {
            if(key === 'phone'){
                //返回代理的电话
                return '1123123'
            }
            if(key === 'price'){
                //原对象不做这件事 返会的是代理的
                return '120000'
            }
            return target[key]
        },
        set:function (target, key, value) {
            if(key === 'customPrice'){
                if(value < 10000){
                    alert('价格太低')
                }else{
                    target[key] = value
                    return true
                }
            }
        }
    })

    // 测试
    console.log(agent.name)
    console.log(agent.age)
    console.log(agent.phone)
    console.log(agent.price)

    agent.customPrice = 15000000;
    console.log(agent.customPrice)

比较

  • 代理模式 - 适配器模式
  1. 适配器模式:提供一个不同的接口
  2. 代理模式:提供一个一模一样的接口代理上去
  • 代理模式 - 装饰器模式
  1. 装饰器模式:拓展功能,之前的功能不变
  2. 代理模式:显示原有功能,但是进过限制和阉割

代码:

https://github.com/ahwgs/design-pattern-learning/tree/master/7.JavaScript%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%E4%B9%8B%E4%BB%A3%E7%90%86%E6%A8%A1%E5%BC%8F

原文:

https://www.ahwgs.cn/javascriptshejimoshizhidailimoshi.html

相关文章

  • [记录]我的设计模式学习路径

    书单 《JavaScript 设计模式与开发实践》《设计模式之美》《掘金小册-JavaScript 设计模式核⼼原...

  • JavaScript设计模式之代理模式

    介绍 使用者无权直接访问目标对象 中间使用代理,通过代理的方式做授权和控制 实例 科学上网 明星经纪人 UML 代...

  • JavaScript 设计模式之代理模式

    什么是代理模式? 首先我们先看一个有趣的例子 在四月一个晴朗的早晨,小明遇见了他的百分百女孩,我们暂且称呼小明的女...

  • JavaScript设计模式四(代理模式)

    JavaScript设计模式四(代理模式) 代理模式的定义: 代理模式是为一个对象提供一个代用品或者占位符,以便对...

  • 设计模式之代理模式

    设计模式之代理模式 10分钟看懂动态代理设计模式(升级篇)-对这篇动态代理模式的思路整理 仿JDK实现动态代理逻辑...

  • 代理模式

    设计模式之代理模式 什么是代理模式? 指的事代理对象为其他对象提供代理以控制对被...

  • JavaScript设计模式之代理模式(Proxy)

    代理模式是为一个对象提供一个代用品或占位符,以便控制对它的访问。 代理模式的关键是,当客户不方便直接访问一个对象或...

  • Javascript设计模式-代理模式

    特点 1.使用者无法直接访问目标对象 2.使用者和目标对象之间加一层代理,通过代理来授权和控制 例如:访问gith...

  • JavaScript设计模式——代理模式

    代理模式 代理的概念 由于一个对象不能直接引用另一个对象,所以需要通过代理对象在这两个对象之间起到中介的作用 以上...

  • JavaScript设计模式——代理模式

    代理模式属于设计模式中结构型的设计模式; 定义:顾名思义就是为一个对象提供一个代用品或占位符,以便控制对它的访问!...

网友评论

      本文标题:JavaScript设计模式之代理模式

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