当前位置: 首页 > article >正文

js代理模式

允许在不改变原始对象的情况下,通过代理对象来访问原始对象。代理对象可以在访问原始对象之前或之后,添加一些额外的逻辑或功能。

科学上网过程

一般情况下,在访问国外的网站,会显示无法访问
因为在dns解析过程,这些ip被禁止解析,所以显示无法访问

引入代理服务器,这个第三方的 ip 地址,不在被禁用的那批 ip 地址之列,我们可以顺利访问到这台服务器。而这台服务器的 DNS 解析过程,是正常的,所以它是可以顺利访问 Google.com 的。代理服务器在请求到 Google.com 后,将响应体转发给你,使你得以间接地访问到目标网址 —— 像这种第三方代替我们访问目标对象的模式,就是代理模式。
在这里插入图片描述

应用

事件代理

利用事件冒泡的特性

 <div id="father">

        <a href="#">链接1</a>

        <a href="#">链接2</a>

        <a href="#">链接3</a>

        <a href="#">链接4</a>

        <a href="#">链接5</a>

        <a href="#">链接6</a>

    </div>

    <script>

        const father = document.getElementById('father')

        father.addEventListener('click', (e) => {

            if (e.target.tagName === 'A') {

                alert(`我是${e.target.innerHTML}`)

            }

  

        })

  
  

    </script>

</body>

虚拟代理

图片懒加载
它是针对图片加载时机的优化:在一些图片量比较大的网站,比如电商网站首页,或者团购网站、小游戏首页等。如果我们尝试在用户打开页面的时候,就把所有的图片资源加载完毕,那么很可能会造成白屏、卡顿等现象。
会采取==“先占位、后加载”==的方式来展示图片 —— 在元素露出之前,我们给它一个 div 作占位,当它滚动到可视区域内时,再即时地去加载真实的图片资源,这样做既减轻了性能压力、又保住了用户体验。

图片预加载。预加载主要是为了避免网络不好、或者图片太大时,页面长时间给用户留白的尴尬。常见的操作是先让这个 img 标签展示一个占位图,然后创建一个 Image 实例,让这个 Image 实例的 src 指向真实的目标图片地址、
观察该 Image 实例的加载情况 —— 当其对应的真实图片加载完毕后,即已经有了该图片的缓存内容,再将 DOM 上的 img 元素的 src 指向真实的目标图片地址。此时我们直接去取了目标图片的缓存,所以展示速度会非常快,从占位图到目标图片的时间差会非常小、小到用户注意不到,这样体验就会非常好了。

  class PreLoadImage {

            // 获取该实例对应的DOM节点

            constructor(imgNode) {

                this.imgNode = imgNode

            }

            setSrc(url) {

                this.imgNode.src=url

            }

        }

        class ProxyImg{

            //默认地址

            static url ="./../../static/1.png"

  

            //获取目标元素

            constructor(targetImg){

                this.targetImg = targetImg

            }

            //操作虚拟img

            setSrc(url){

                // 设置默认图片

                this.targetImg.setSrc(ProxyImg.url)

                //创建一个img实例

                const vitualImg = new Image()

                vitualImg.src = url

                //监听img加载情况

                vitualImg.onload = ()=>{

                    this.targetImg.setSrc(url)

                }

            }

  

        }

  
  
  

        const imgNode = document.getElementById('img')

        const proxyImg = new ProxyImg(new PreLoadImage(imgNode))

        proxyImg.setSrc('https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png')

在这个实例中,virtualImage 这个对象是一个“幕后英雄”,它始终存在于 JavaScript 世界中、代替真实 DOM 发起了图片加载请求、完成了图片加载工作,却从未在渲染层面抛头露面。因此这种模式被称为“虚拟代理”模式。

缓存代理

它应用于一些计算量较大的场景里。

  • 我们需要“用空间换时间”——当我们需要用到某个已经计算过的值的时候,不想再耗时进行二次计算,而是希望能从内存里去取出现成的计算结果。

  • 这种场景下,就需要一个代理来帮我们在进行计算的同时,进行计算结果的缓存了。

//需求:对传入的所有参数进行求和

function addAll(){

    console.log('进行了一次计算');

    let sum = 0;

    for(let i = 0; i < arguments.length; i++){

        sum += arguments[i];

    }

    return sum;

}

  

function proxyAddAll(){

    //创造一个缓存池

    let cache = {};

    return function(...args){

        //将传入的参数转化为字符串,作为缓存的key

        let key = args.join(',');

        if(key in cache){

            return cache[key];

        }

        return cache[key] = addAll(...args);

    }

}

  

let proxy = proxyAddAll();

console.log(proxy(1,2,3,4,5)); //15

console.log(proxy(1,2,3,4,5)); //15

保护代理

ES6中的Proxy
开婚介所的时候,为了保护用户的私人信息,我们会在同事哥访问小美的年龄的时候,去校验同事哥是否已经通过了我们的实名认证;为了确保同事哥确实是一位有诚意的男士,当他想获取小美的联系方式时,我们会校验他是否具有VIP 资格。所谓“保护代理”,就是在访问层面做文章,在 getter 和 setter 函数里去进行校验和拦截,确保一部分变量是安全的。


http://www.kler.cn/a/488459.html

相关文章:

  • .NET体系架构
  • ubuntu 20.04 安装docker--小白学习之路
  • 有收到腾讯委托律师事务所向AppStore投诉带有【水印相机】主标题名称App的开发者吗
  • HarmonyOS中实现TabBar(相当于Android中的TabLayout+ViewPager)
  • 《深度学习模型在鸿蒙分布式框架下的跨设备高效之旅》
  • 【蓝桥杯选拔赛真题60】C++寻宝石 第十四届蓝桥杯青少年创意编程大赛 算法思维 C++编程选拔赛真题解
  • 用c实现C++类(八股)
  • 【网络云SRE运维开发】2025第2周-每日【2025/01/09】小测-【第9章 VRRP原理及基本配置考试】理论和实操
  • UniAPP和Vue3生命周期hook
  • 【计算机网络】课程 实验二 交换机基本配置和VLAN 间路由实现
  • mysql和redis的最大连接数
  • Linux之线程池与单例模式
  • GPT-1模型详解及代码复现
  • 利用Python爬虫获取义乌购店铺所有商品列表:技术探索与实践
  • 开启Excel导航仪,跨表跳转不迷路-Excel易用宝
  • IntelliJ IDEA中Maven项目的配置、创建与导入全攻略
  • windows C#-泛型类型参数的约束详解(一)
  • 算法-盒子中小球的最大数量
  • C16.【C++ Cont】string类字符串的关系运算和与string有关的函数
  • JavaScript系列(10)-- Map数据结构专题
  • 如何确保获取的淘宝详情页数据的准确性和时效性?
  • 基于Ubuntu2404脚本搭建openstackC版-ovn网络驱动
  • 设计模式 创建型 抽象工厂模式(Abstract Factory)与 常见技术框架应用 解析
  • Win32汇编学习笔记06.APIHook
  • 单片机 期末笔记
  • 《探秘鸿蒙NEXT中的人工智能核心架构》