在JavaScript设计模式中有一种模式为代理模式,但是在代理模式之下,还有我们一般不了解的四种模式。来一起温故而知新,看看有哪些是你不清楚的模式。

事件代理

事件代理是代理中最常见的一种,也是一道实打实的高频面试题,它的场景是一个父元素下有多个子元素。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>事件代理</title>
</head>
<body><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>
</body>
</html>

我们的需求是每点击一个a标签,都可以弹出”一句话“的提示,比如点击第一个a,我们弹出 链接 1号这样的操作。

老的做法,使用循环绑定事件

const aNodes = document.getElementById('father').getElementsByTagName('a')
const aLength = aNodes.length
aLength.forEach((ele,index) =>{// 添加监听事件aNodes[i].addEventListener('click', function (a) {e.preventDefault()alert(`我是${aNodes[i].innerText`)      })
}}

缺点:我们需要循环给安装六个监听函数,,如果a标签更多,那么性能消耗会更大。

新的做法,事件代理做法

考虑到事务具有冒泡性,当我们点击a标签的时候,会冒泡到父级。从而被监听。我们则只需要给父级绑定一个监听事件即可。

<div><button id='open'>打开弹框</button><button id='close'>关闭弹框</button>
</div>document.getElementById('box').addEventListener('click', function (e) {e.preventDefault()console.log(e.target.tagName == 'BUTTON' && alert(e.target.inerHTML))
})

虚拟代理

懒加载:它是针对突破加载时机的优化,在一些图片量比较大的网站,如:电商网站首页,团购网站,小游戏首页等。如果我们尝试在用户打开页面的时候就把所有的图片资源加载完毕,那么很有可能会造成白屏、卡顿。

所以我们的做法一般是先占位,后加载。 在元素露出之前,我们先给他一个div占位,当它滚动到可视化区域的时候,再去加载真实的图片资源,这样既减轻了性能压力,又保住了用户体验。

除过懒加载外,还有一种操作叫做预加载。它主要是为了避免网络不好的时候,或者图片过大时,页面长时间给用户留白的尴尬,常见的操作是先让这个img标签展示一个展位图,然后创建一个image实例,让这个image实例的src指向真是的目标图片地址。观察image实例的加载情况,当其对应的真实图片加载完毕后,就已经有了该图片的缓存内容,再将DOM上的img元素的src指向真实的目标图片地址,此时我们直接去取目标图片的缓存,所以会非常快。从展位图到目标图片的事件会非常小。

let myImage = function () {let img = document.createElement('img');document.body.appendChild(img);return {setSrc ( src ) {img.src = src;}}
}();
proxyImage = function () {let img = new Image;img.onload = function () {myImage.setSrc( this.src );}return {setProxyImage( src ) {myImage.setSrc("https://img.zcool.cn/community/01e2115d5d5c7da80120695c137bfb.jpg@1280w_1l_2o_100sh.jpg"); // 此处为加载 loading 图片,用来占位,本地图片(作者使用网络图片)img.src = src;}}
}();
proxyImage.setProxyImage("https://img.zcool.cn/community/01a5d45543cd170000019ae94fc087.jpg@

缓存代理

在一些计算量较大的场景下,我们需要用空间换时间,例如:当我们需要用到某个已经计算过的值的时候,不想再耗时进行二次计算,而是希望能够从内存中去取现成的计算结果,这种场景下,就需要一个代理来帮我们进行计算的同时,缓存计算结果。

// addAll方法会对你传入的所有参数做求和操作
const addAll = function(
) {console.log('进行了一次新计算')let result = 0const len = arguments.lengthfor(let i = 0; i < len; i++) {result += arguments[i]}return result
}// 为求和方法创建代理
const proxyAddAll = (function(
){// 求和结果的缓存池const resultCache = {}return function(
) {// 将入参转化为一个唯一的入参字符串const args = Array.prototype.join.call(arguments, ',')// 检查本次入参是否有对应的计算结果if(args in resultCache) {// 如果有,则返回缓存池里现成的结果return resultCache[args]}return resultCache[args] = addAll(...arguments)}
})()

结果如上,第二次速度比第一次更快。直接从缓存中取出。

保护代理

这个其实大家大多数都知道,就是使用proxy来进行代理,保护另一个对象的一部分东西。例如,一个19岁的小孩子要去相亲,这时候相亲网的系统中需要有保护,20岁以下的不允许相亲。所以,保护代理这不就出来了。

例如:

// 珍爱网
const 珍爱网 () {const BlindDate () { // 发起相亲请求return '你们开始相亲了'}return {join}
}const 系统 (你的信息) {this.你的信息 = 你的信息const 判断资格 = function () {if( 你的信息.年龄  < 20){return "年龄不够资格,不允许相亲"        }else{珍爱网().BlindDate()     }}return 判断资格
}console.log(系统({姓名:小孩子,年龄:19});

JavaScript代理模式之四大代理相关推荐

  1. java动态代理_Java代理模式及动态代理详解

    Java的动态代理在实践中有着广泛的使用场景,比如最场景的Spring AOP.Java注解的获取.日志.用户鉴权等.本篇文章带大家了解一下代理模式.静态代理以及基于JDK原生动态代理. 代理模式 无 ...

  2. 代理模式、动态代理和面向方面

    代理的意思很好理解,它借鉴了我们日常所用的代理的意思:就是本来该自己亲自去做的某件事,由于某种原因不能直接做,而只能请人代替你做,这个被你请来做事的人就是代理.比如过春节要回家,由于你要上班,没时间去 ...

  3. Java的代理模式之静态代理和动态代理

    文章目录 静态代理 动态代理 jdk生成代理对象 cglib代理 代理模式简介: 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目 ...

  4. 代理模式和动态代理模式_代理模式介绍

    代理模式和动态代理模式 代表:被选中或当选为他人投票或代理的人– Merriam-Webster . 委托模式:在软件工程中,委托模式是面向对象编程中的一种设计模式,其中,一个对象而不是执行其陈述的任 ...

  5. 【学习笔记】结合代码理解设计模式 —— 代理模式(静态代理、动态代理、延伸)

    文章目录 什么是代理模式 一. 代理模式简介 二. 静态代理模式 三. 动态代理模式 万能模版 前言:笔记基于狂神设计模式视频.<大话设计模式>观后而写 (最近一直在更新之前的刷题博客,今 ...

  6. Java拾遗:007 - 代理模式与动态代理

    2019独角兽企业重金招聘Python工程师标准>>> 代理模式 在日常开发中我们可以会接手一些老的项目,有时连源码都没有,或者有时候我会需要对业务逻辑做一定增强(功能扩展,如:日志 ...

  7. Java代理模式及动态代理详解

    本文转自:程序新视界公众号 Java的动态代理在实践中有着广泛的使用场景,比如最场景的Spring AOP.Java注解的获取.日志.用户鉴权等.本篇文章带大家了解一下代理模式.静态代理以及基于JDK ...

  8. Java内功修炼系列:代理模式及动态代理

    目录 一 代理模式 1.1 简介 1.2 代理模式角色定义 二 静态代理 2.1 介绍和实例 2.2 静态代理的缺点 三 动态代理 3.1 基于JDK原生动态代理实现 四 小结 一 代理模式 1.1 ...

  9. Java篇 - 代理模式和动态代理实现原理

    设计模式中有一种模式叫代理模式,Spring框架离不开动态代理技术,Android hook技术用到了反射 + 动态代理,Framework中我们也经常看到各种proxy,如ApplicationTh ...

最新文章

  1. Struts1和Struts2对照
  2. 简单删除我的电脑里的wps云文档图标
  3. Android--屏幕方向的改变
  4. 利用WinRAR命令行压缩文件或文件夹2007-11-14 15:07压缩文件夹
  5. unity 脚本中 调用另一个脚本_Unity 2019.4 脚本生命周期
  6. 团队开发项目--校园知网 nabcd 需求分析
  7. 对人工智能的应用、发展及其影响的思考
  8. 记录 之 遇到的 lamda 表达式和功能理解
  9. com.jhlabs:imaging:jar:01012005 所在仓库+captcha验证码maven依赖
  10. 好友消息和群消息区别
  11. Web前端笔记-解决NicSroll使用后页面跳动(每次刷新或进入跳动一下然后正常)问题
  12. 【tool】企业级开源分布式文件服务器搭建(FastDFS)
  13. JavaEE学习01--Tomcat服务器
  14. 【安全牛学习笔记】初识sql注入漏洞原理
  15. Foxmail设置标签
  16. DNSPod-免费智能DNS解析服务商
  17. 如何接受上级指令_职场老手教你怎么应对领导错误的指令,千万要注意这几点...
  18. ubuntu20.04中安装划词翻译_支持语音录入翻译的小爱同学鼠标让智能设备控制一手掌握...
  19. 5-3 人际资源整合-辨别同事、结交优质同事、拒绝烂同事
  20. Harbor镜像库搭建以及如何在idea上构建镜像并推送Harbor

热门文章

  1. 2019Python人工智能前景怎么样?
  2. OCR之Tesseract安装
  3. 如何使用数据包破解游戏 - 从这里开始
  4. 解题笔记(15)——几个栈和递归的问题
  5. 暴雪不管的国服 链游要插手
  6. python鼠标点击事件event_opencv-python教程学习系列5-处理鼠标事件
  7. ios自建服务器降级,iOS14降级操作步骤 iOS14怎么降级到iOS13
  8. Unity 中遮挡层级
  9. 示波器测量红外遥控器晶振
  10. 奇怪的日常 [ 1 ]:个人微信如何实现自动回复