js代理模式

server/2025/1/12 7:15:42/

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

科学上网过程

一般情况下,在访问国外的网站,会显示无法访问
因为在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}//操作虚拟imgsetSrc(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){//将传入的参数转化为字符串,作为缓存的keylet 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)); //15console.log(proxy(1,2,3,4,5)); //15

保护代理

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


http://www.ppmy.cn/server/157692.html

相关文章

7 分布式定时任务调度框架

先简单介绍下分布式定时任务调度框架的使用场景和功能和架构&#xff0c;然后再介绍世面上常见的产品 我们在大型的复杂的系统下&#xff0c;会有大量的跑批&#xff0c;定时任务的功能&#xff0c;如果在独立的子项目中单独去处理这些任务&#xff0c;随着业务的复杂度的提高…

B+树在MySQL中的应用价值

为什么MySQL选择B树存储数据 在数据库管理系统中&#xff0c;存储和查询数据的效率直接影响系统的性能。MySQL 作为最常用的关系型数据库之一&#xff0c;其存储引擎&#xff08;例如 InnoDB&#xff09;选择了 B 树作为索引的数据结构。这种选择并非偶然&#xff0c;而是经过…

Java基础:equals()方法与==的区别

1、超类Object的equals()底层原理&#xff1a; 在Object超类中已经提供了equals()方法&#xff0c;源码如下&#xff1a; public boolean equals(Object obj) { return (this obj); } 所有的对象都拥有标识&#xff08;内存地址&#xff09;和状态&#xff08;数据&a…

Java Web开发进阶——Spring Security基础与应用

Spring Security是Spring框架的核心模块之一&#xff0c;用于保护Web应用程序和微服务的安全。它提供强大的认证和授权功能&#xff0c;并与Spring生态系统无缝集成。本节将详细介绍Spring Security的基础知识及其在实际项目中的应用。 1. Spring Security概述与功能 1.1 什么…

微信小程序实现拖拽盒子效果

要实现一个当前盒子高度由里面的盒子进行支配高度拖拽的效果 // wxml<view class"exmation-item" wx:elif"{{type4}}"> <view class"exmation-item-drag-box" id"drag-box"> <!-- 内容 --><view class"exm…

Scala语言的软件开发工具

Scala语言的软件开发工具 Scala是一种静态类型的编程语言&#xff0c;它结合了面向对象和函数式编程的特性。自2003年由马丁奥德斯基&#xff08;Martin Odersky&#xff09;发明以来&#xff0c;Scala因其简洁的语法和强大的功能&#xff0c;逐渐成为了现代软件开发领域的重要…

Web前端开发入门学习笔记之CSS 57-58--新手超级友好版- 盒子模型以及边框线应用篇

Foreword写在前面的话&#xff1a; 大家好&#xff0c;我是一名刚开始学习HTML的新手。这篇文章是我在学习html过程中的一些笔记和心得&#xff0c;希望能和同样在学习HTML的朋友们分享。由于我的知识有限&#xff0c;文章中可能存在错误或不准确的地方&#xff0c;欢迎大家在评…

SpringBoot开发—— SpringBoot中如何实现 HTTP 请求的线程隔离

文章目录 1、Servlet 容器与线程池管理1.1 线程池的作用1.2 线程池的配置 2、HTTP 请求的线程隔离2.1 请求上下文和会话信息2.2 多线程处理的隔离性 3、 ThreadLocal 和线程上下文隔离3.1ThreadLocal的使用3.2 保证线程隔离性 4、Async异步任务的线程隔离4.1 异步任务的线程池4…