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

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}//操作虚拟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 函数里去进行校验和拦截,确保一部分变量是安全的。

相关文章:

js代理模式

允许在不改变原始对象的情况下&#xff0c;通过代理对象来访问原始对象。代理对象可以在访问原始对象之前或之后&#xff0c;添加一些额外的逻辑或功能。 科学上网过程 一般情况下,在访问国外的网站,会显示无法访问 因为在dns解析过程,这些ip被禁止解析,所以显示无法访问 引…...

C++虚函数(八股总结)

什么是虚函数 虚函数是在父类中定义的一种特殊类型的函数&#xff0c;允许子类重写该函数以适应其自身需求。虚函数的调用取决于对象的实际类型&#xff0c;而不是指针或引用类型。通过将函数声明为虚函数&#xff0c;可以使继承层次结构中的每个子类都能够使用其自己的实现&a…...

vue的路由守卫逻辑处理不当导致部署在nginx上无法捕捉后端异步响应消息等问题

近期对前端的路由卫士有了更多的认识。 何为路由守卫&#xff1f;这可能是一种约定俗成的名称。就是VUE中的自定义函数&#xff0c;用来处理路由跳转。 import { createRouter, createWebHashHistory } from "vue-router";const router createRouter({history: cr…...

[备忘.OFD]OFD是什么、OFD与PDF格式文件的互转换

‌OFD&#xff08;Open Fixed-layout Document&#xff09;是一种由工业和信息化部软件司牵头中国电子技术标准化研究院制定的版式文档国家标准&#xff0c;属于中国的一种自主格式‌‌。OFD旨在打破政府部门和党委机关电子公文格式不统一的问题&#xff0c;以方便电子文档的存…...

Pycharm连接远程解释器

这里写目录标题 0 前言1 给项目添加解释器2 通过SSH连接3 找到远程服务器的torch环境所对应的python路径&#xff0c;并设置同步映射&#xff08;1&#xff09;配置服务器的系统环境&#xff08;2&#xff09;配置服务器的conda环境 4 进入到程序入口&#xff08;main.py&#…...

嵌入式系统 tensorflow

&#x1f3ac; 秋野酱&#xff1a;《个人主页》 &#x1f525; 个人专栏:《Java专栏》《Python专栏》 ⛺️心若有所向往,何惧道阻且长 文章目录 探索嵌入式系统中的 TensorFlow&#xff1a;机遇与挑战一、TensorFlow 适配嵌入式的优势二、面临的硬件瓶颈三、软件优化策略四、实…...

深度学习知识点:LSTM

文章目录 1.应用现状2.发展历史3.基本结构4.LSTM和RNN的差异 1.应用现状 长短期记忆神经网络&#xff08;LSTM&#xff09;是一种特殊的循环神经网络(RNN)。原始的RNN在训练中&#xff0c;随着训练时间的加长以及网络层数的增多&#xff0c;很容易出现梯度爆炸或者梯度消失的问…...

11.C语言内存管理与常用内存操作函数解析

目录 1.简介2.void 指针3.malloc4.free5.calloc6.realloc7.restrict 说明符8.memcpy9.memmove()10.memcmp 1.简介 本篇原文为&#xff1a;C语言内存管理与常用内存操作函数解析。 更多C进阶、rust、python、逆向等等教程&#xff0c;可点击此链接查看&#xff1a;酷程网 C 语…...

Python 中的错误处理与调试技巧

&#x1f496; 欢迎来到我的博客&#xff01; 非常高兴能在这里与您相遇。在这里&#xff0c;您不仅能获得有趣的技术分享&#xff0c;还能感受到轻松愉快的氛围。无论您是编程新手&#xff0c;还是资深开发者&#xff0c;都能在这里找到属于您的知识宝藏&#xff0c;学习和成长…...

门禁系统与消防报警的几种联动方式

1、规范中要求的出入口系统与消防联动 1.1《建筑设计防火规范》GB 50016-2018 1.2《民用建筑电气设计规范》JGJ 16-2008  14.4出入口控制系统 3 设置在平安疏散口的出入口限制装置&#xff0c;应与火灾自动报警系统联动;在紧急状况下应自动释放出入口限制系统&…...

云原生安全风险分析

一、什么是云原生安全 云原生安全包含两层含义&#xff1a; 面向云原生环境的安全具有云原生特征的安全 0x1&#xff1a;面向云原生环境的安全 面向云原生环境的安全的目标是防护云原生环境中基础设施、编排系统和微服务等系统的安全。 这类安全机制不一定具备云原生的特性…...

解决cursor50次使用限制问题并恢复账号次数

视频内容&#xff1a; 在这个视频教程中&#xff0c;我们将演示如何解决科sir软件50次使用限制的问题&#xff0c;具体步骤包括删除和注销账号、重新登录并刷新次数。教程详细展示了如何使用官网操作将账号的剩余次数恢复到250次&#xff0c;并进行软件功能测试。通过简单的操…...

python学习笔记—16—数据容器之元组

1. 元组——tuple(元组是一个只读的list) (1) 元组的定义注意&#xff1a;定义单个元素的元组&#xff0c;在元素后面要加上 , (2) 元组也支持嵌套 (3) 下标索引取出元素 (4) 元组的相关操作 1. index——查看元组中某个元素在元组中的位置从左到右第一次出现的位置 t1 (&qu…...

rabbitmq——岁月云实战笔记

1 rabbitmq设计 生产者并不是直接将消息投递到queue,而是发送给exchange,由exchange根据type的规则来选定投递的queue,这样消息设计在生产者和消费者就实现解耦。 rabbitmq会给没有type预定义一些exchage,而实际我们却应该使用自己定义的。 1.1 用户注册设计 用户在…...

Matlab APP Designer

我想给聚类的代码加一个图形化界面&#xff0c;需要输入一些数据和一些参数并输出聚类后的图像和一些评价指标的值。 gpt说 可以用 app designer 界面元素设计 在 设计视图 中直接拖动即可 如图1&#xff0c;我拖进去一个 按钮 &#xff0c;图2 红色部分 出现一行 Button 图…...

CSS语言的编程范式

CSS语言的编程范式 引言 在现代网页开发中&#xff0c;CSS&#xff08;层叠样式表&#xff09;作为一种样式语言&#xff0c;承担着网站前端呈现的重要角色。无论是简单的静态网页还是复杂的单页应用&#xff0c;CSS都在人机交互中发挥着至关重要的作用。掩盖在美观背后的&am…...

一个简单的php博客

一个简单的 PHP 博客的示例代码&#xff1a; 收起 php <?php // 连接数据库 $servername "localhost"; $username "root"; $password ""; $dbname "blog_db";// 创建连接 $conn new mysqli($servername, $username, $passw…...

解决anaconda prompt找不到的情况

由于打开某个文件夹导致系统卡死了&#xff0c;鼠标使用不了&#xff0c;只能使用快捷键ctrlaltdelete打开&#xff0c;点任务管理器也没什么用&#xff0c;就点了注销选项。 注销&#xff1a;清空缓存空间和注册表信息&#xff0c;向系统发出清除现在登陆的用户的请求。 导致…...

【深度学习】多目标融合算法(二):底部共享多任务模型(Shared-Bottom Multi-task Model)

目录 一、引言 1.1 往期回顾 1.2 本期概要 二、Shared-Bottom Multi-task Model&#xff08;SBMM&#xff09; 2.1 技术原理 2.2 技术优缺点 2.3 业务代码实践 三、总结 一、引言 在朴素的深度学习ctr预估模型中&#xff08;如DNN&#xff09;&#xff0c;通常以一个行…...

如何使用vue引入three.js

在 Vue.js 项目中引入和使用 Three.js 是一个常见的需求&#xff0c;Three.js 是一个用于在浏览器中创建和显示动画 3D 计算机图形的 JavaScript 库。以下是一个基本的示例&#xff0c;展示如何在 Vue 项目中引入和使用 Three.js。 1. 创建 Vue 项目 如果你还没有一个 Vue 项…...

W25Q256JWEIQ 1.8V 低功耗大容量串行 NOR Flash存储器——华邦电子 全新原装芯片IC

W25Q256JWEIQ&#xff1a;1.8V 低功耗大容量串行 NOR Flash——华邦 SpiFlash 系列&#xff0c;为嵌入式系统注入节能存储芯动力 Winbond&#xff08;华邦电子&#xff09;推出的 W25Q256JWEIQ 256Mbit 串行 NOR Flash-存储器&#xff0c; 1.7V ~ 1.95V 的低电压供电、133MHz …...

InvoiceNet未来展望:AI发票解析技术的发展趋势和社区规划

InvoiceNet未来展望&#xff1a;AI发票解析技术的发展趋势和社区规划 【免费下载链接】InvoiceNet Deep neural network to extract intelligent information from invoice documents. 项目地址: https://gitcode.com/gh_mirrors/in/InvoiceNet InvoiceNet作为一款基于深…...

Elasticsearch RTF安全配置终极指南:X-Pack安装与免费License申请教程

Elasticsearch RTF安全配置终极指南&#xff1a;X-Pack安装与免费License申请教程 【免费下载链接】elasticsearch-rtf elasticsearch中文发行版&#xff0c;针对中文集成了相关插件&#xff0c;方便新手学习测试. 项目地址: https://gitcode.com/gh_mirrors/el/elasticsearc…...

外卖系统订单模块设计避坑指南:地址簿管理与状态流转实战

外卖系统订单模块设计避坑指南&#xff1a;地址簿管理与状态流转实战 中午12点&#xff0c;写字楼里的白领们纷纷打开外卖APP下单午餐。短短几分钟内&#xff0c;系统需要处理成千上万笔订单——验证用户地址、确认支付状态、通知商家接单。这背后是一套复杂的订单系统在支撑&a…...

GLM-OCR模型处理SolidWorks工程图中的技术说明

GLM-OCR模型处理SolidWorks工程图中的技术说明 在制造业和工程设计领域&#xff0c;SolidWorks输出的二维工程图是产品信息的核心载体。一张图纸里&#xff0c;除了几何图形&#xff0c;还包含了大量的文本信息&#xff1a;技术要求、标题栏里的零件名称与材料、明细表中的零件…...

FramePack视频扩散技术探索:从原理到实践的全流程指南

FramePack视频扩散技术探索&#xff1a;从原理到实践的全流程指南 【免费下载链接】FramePack Lets make video diffusion practical! 项目地址: https://gitcode.com/gh_mirrors/fr/FramePack 副标题&#xff1a;如何解决AI舞蹈视频创作中的效率与质量平衡问题 FrameP…...

02-Spec驱动开发:把需求编译成代码

Spec 驱动开发&#xff1a;把需求编译成代码 AI 原生开发里最关键的一步&#xff0c;不是先让 AI 写代码&#xff0c;而是先让需求变成规范。 因为 AI 再强&#xff0c;也需要明确输入&#xff1b;而工程实现&#xff0c;再灵活也必须足够精确。 为什么规范是第一性原理 课程里…...

新手零基础入门:用快马平台可视化学习openclaw核心配置

作为一名刚接触机器人开发的新手&#xff0c;我最近在学习openclaw机械爪的配置时遇到了不少困惑。那些抽象的参数名称和数值范围让我一头雾水&#xff0c;直到发现了InsCode(快马)平台的可视化学习方式&#xff0c;才真正理解了这些配置参数的实际意义。下面分享我的学习笔记&…...

libhv实战:从零构建一个可扩展的微型HTTP服务器

1. 为什么选择libhv构建微型HTTP服务器 第一次接触libhv这个网络库时&#xff0c;我正为一个物联网项目寻找轻量级的HTTP解决方案。当时试过不少开源框架&#xff0c;要么太臃肿&#xff0c;要么性能不达标&#xff0c;直到发现libhv的tinyhttpd示例——不到400行代码就实现了完…...

避开这3个坑,你的LVGL界面动画才能流畅不卡顿:定时器使用避坑指南

避开这3个坑&#xff0c;你的LVGL界面动画才能流畅不卡顿&#xff1a;定时器使用避坑指南 在嵌入式GUI开发中&#xff0c;流畅的动画效果往往能大幅提升用户体验。但很多开发者在使用LVGL定时器实现动画时&#xff0c;常会遇到界面卡顿、响应迟缓的问题。这通常不是LVGL本身的问…...