范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

前端必须懂的设计模式代理模式

  动机由于一个对象不想或者不能直接引用另外一个对象,所以需要通过通过一个称之为"代理"的第三者来实现间接引用 代理模式就是为目标对象创造一个代理对象,在客户端和目标对象之间起到中介的作用 这样就可以在代理对象里增加一些逻辑判断、调用前或调用后执行一些操作,从而实现了扩展目标的功能 并且可以通过代理对象去掉客户不能看到的内容和服务或者添加客户需要的额外服务
  通过引入一个新的对象(如小图片和远程代理对象)来实现对真实对象的操作或者将新的对 象作为真实对象的一个替身,这种实现机制即为代理模式,通过引入代理对象来间接访问一 个对象,这就是代理模式的模式动机。 定义
  代理模式(Proxy Pattern) :给某一个对象提供一个代理,并由代理对象控制对原对象的引用。代理模式的英 文叫做Proxy或Surrogate,它是一种对象结构型模式。 生活中的案例:
  火车票代购、房产中介、律师、海外代购、明星经纪人 类图和时序图
  代理模式包含如下角色: Subject: 抽象主题角色 Proxy: 代理主题角色 RealSubject: 真实主题角色 类图
  时序图
  一个例子-明星经纪人
  abstract class Star {     abstract answerPhone(): void; }  class Angelababy extends Star {     public available: boolean = true;     answerPhone(): void {         console.log("你好,我是Angelababy.");     } } class AngelababyAgent extends Star {     constructor(private angelababy: Angelababy) {         super();     }     answerPhone(): void {         console.log("你好,我是Angelababy的经纪人.");         if (this.angelababy.available) {             this.angelababy.answerPhone();         }     } } let angelababyAgent = new AngelababyAgent(new Angelababy()); angelababyAgent.answerPhone(); 场景事件委托代理事件捕获指的是从document到触发事件的那个节点,即自上而下地去触发事件 事件冒泡是自下而上地去触发事件 绑定事件方法的第三个参数,就是控制事件触发顺序是否为事件捕获。true为事件捕获;false为事件冒泡,默认false。
       
  • 1
  • 2
  • 3
虚拟代理(图片预加载)app.jslet express=require("express"); let path=require("path") let app=express(); app.get("/images/loading.gif",function (req,res) { res.sendFile(path.join(__dirname,req.path)); }); app.get("/images/:name",function (req,res) { setTimeout(() => { res.sendFile(path.join(__dirname,req.path)); }, 2000); }); app.get("/",function (req,res) { res.sendFile(path.resolve("index.html")); }); app.listen(8080); index.html Document 虚拟代理(图片懒加载)当前可视区域的高度 window.innerHeight || document.documentElement.clientHeight 元素距离可视区域顶部的高度 getBoundingClientRect().top getBoundingClientRect DOMRect 对象包含了一组用于描述边框的只读属性——left、top、right 和 bottom,单位为像素。除了 width 和 height 外的属性都是相对于视口的左上角位置而言的 Lazy-Load 缓存代理   有些时候可以用空间换时间 正整数的阶乘(factorial)   一个正整数的阶乘(factorial)是所有小于及等于该数的正整数的积,并且0的阶乘为1 const factorial = function f(num) { if (num === 1) { return 1; } else { return (num * f(num - 1)); } } const proxy = function (fn) { const cache = {}; // 缓存对象 return function (num) { if (num in cache) { return cache[num]; // 使用缓存代理 } return cache[num] = fn.call(this, num); } } const proxyFactorial = proxy(factorial); console.log(proxyFactorial(5)); console.log(proxyFactorial(5)); console.log(proxyFactorial(5)); 斐波那契数列(Fibonacci sequence)   指的是这样一个数列:1、1、2、3、5、8、13、21、34。在数学上,斐波那契数列以如下被以递推的方法定义:F(1)=1,F(2)=1,F(n)=F(n-1)+F(n-2)(n>=3,n∈N*) let count = 0; function fib(n) { count++; return n <= 2 ? 1 : fib(n - 1) + fib(n - 2); } var result = fib(10); console.log(result, count);//55 110 let count = 0; const fibWithCache = (function () { let cache = {}; function fib(n) { count++; if (cache[n]) { return cache[n]; } let result = n <= 2 ? 1 : fib(n - 1) + fib(n - 2); cache[n] = result; return result; } return fib; })(); var result = fibWithCache(10); console.log(result, count);//55 17 防抖代理通过防抖代理优化可以把多次请求合并为一次,提高性能 节流与防抖都是为了减少频繁触发事件回调 节流(Throttle)是在某段时间内不管触发了多少次回调都只认第一个,并在第一次结束后执行回调 防抖(Debounce)就是在某段时间不管触发了多少回调都只看最后一个 节流 Document 防抖 Document 防抖案例 -未防抖
  app.js let express=require("express"); let app=express(); app.use(express.static(__dirname)); let todos=[ {id: 1,text: "a",completed: false}, {id: 2,text: "b",completed: false}, {id: 3,text: "c",completed: false}, ]; app.get("/todos",function (req,res) { res.json(todos); }); app.get("/toggle/:id",function (req,res) { let id=req.params.id; todos = todos.map(item => { if (item.id==id) { item.completed=!item.completed; } return item; }); res.json({code:0}); }); app.listen(8080); 防抖案例 -防抖   todos.html
  app.js app.get("/toggle/:ids",function (req,res) { let ids=req.params.ids; ids=ids.split(",").map(item=>parseInt(item)); todos = todos.map(item => { if (ids.includes(item.id)) { item.completed=!item.completed; } return item; }); res.json({code:0}); }); 代理跨域正向代理正向代理的对象是客户端,服务器端看不到真正的客户端 通过公司代理服务器上网   反向代理反向代理的对象的服务端,客户端看不到真正的服务端 nginx代理应用服务器   proxy-server.js const http = require("http"); const httpProxy = require("http-proxy"); //创建一个代理服务 const proxy = httpProxy.createProxyServer(); //创建http服务器并监听8888端口 let server = http.createServer(function (req, res) { //将用户的请求转发到本地9999端口上 proxy.web(req, res, { target: "http://127.0.0.1:9999" }); //监听代理服务错误 proxy.on("error", function (err) { console.log(err); }); }); server.listen(8888, "0.0.0.0");   real-server.js const http = require("http"); let server = http.createServer(function (req, res) { res.end("9999"); }); server.listen(9999, "0.0.0.0"); 代理跨域nginx代理跨域 webpack-dev-server 代理跨域客户端代理跨域 当前的服务启动在origin(3000端口)上,但是调用的接口在target(4000端口)上 postMessage方法可以安全地实现跨源通信 otherWindow:其他窗口的一个引用 message:将要发送到其他window的数据message 将要发送到其他window的数据targetOrigin通过窗口的origin属性来指定哪些窗口能接收到消息事件,其值可以是字符串"*"(表示无限制)或者一个URI otherWindow.postMessage(message, targetOrigin, [transfer]); data 从其他window中传递过来的对象 origin 调用postMessage时消息发送方窗口的origin source 对发送消息的窗口对象的引用 window.addEventListener("message", receiveMessage, false);   origin.js let express=require("express"); let app=express(); app.use(express.static(__dirname)); app.listen(3000);   target.js let express = require("express"); let app = express(); let bodyParser = require("body-parser"); app.use(bodyParser.urlencoded({ extended: true })); app.use(express.static(__dirname)); let users = []; app.post("/register", function (req, res) { let body = req.body; let target = body.target; let callback = body.callback; let username = body.username; let password = body.password; let user = { username, password }; let id = users.length == 0 ? 1 : users[users.length - 1].id + 1; user.id = id; users.push(user); res.status(302); res.header("Location", `${target}?callback=${callback}&args=${id}`); res.end(); }); app.listen(4000);   reg.html Document   target.html Document $.proxy接受一个函数,然后返回一个新函数,并且这个新函数始终保持了特定的上下文语境。 jQuery.proxy( function, context ) function为执行的函数,content为函数的上下文this值会被设置成这个object对象 jquery proxy function proxy(fn, context) { return function () { return fn.call(context, arguments); } } ProxyProxy 用于修改某些操作的默认行为 Proxy 可以理解成,在目标对象之前架设一层 拦截 ,外界对该对象的访问,都必须先通过这层拦截,因此提供了一种机制,可以对外界的访问进行过滤和改写。Proxy 这个词的原意是代理,用在这里表示由它来 代理 某些操作,可以译为代理器 Proxy defineProperty let wang={ name: "wanglaoshi", age: 29, height:165 } let wangMama=new Proxy(wang,{ get(target,key) { if (key == "age") { return wang.age-1; } else if (key == "height") { return wang.height-5; } return target[key]; }, set(target,key,val) { if (key == "boyfriend") { let boyfriend=val; if (boyfriend.age>40) { throw new Error("太老"); } else if (boyfriend.salary<20000) { throw new Error("太穷"); } else { target[key]=val; return true; } } } }); console.log(wangMama.age); console.log(wangMama.height); wangMama.boyfriend={ age: 41, salary:3000 } Vue2和Vue3   Vue2 中的变化侦测实现对 Object 及 Array 分别进行了不同的处理,Object 使用了 Object.defineProperty API,Array使用了拦截器对 Array 原型上的能够改变数据的方法进行拦截。虽然也实现了数据的变化侦测,但存在很多局限 ,比如对象新增属性无法被侦测,以及通过数组下边修改数组内容,也因此在 Vue2 中经常会使用到 $set 这个方法对数据修改,以保证依赖更新。   Vue3 中使用了 es6 的 Proxy API对数据代理,没有像 Vue2 中对原数据进行修改,只是加了代理包装,因此首先性能上会有所改善。其次解决了 Vue2 中变化侦测的局限性,可以不使用 $set 新增的对象属性及通过下标修改数组都能被侦测到。 对比代理模式 VS 适配器模式   适配器提供不同接口,代理模式提供一模一样的接口 代理模式 VS 装饰器模式   装饰器模式原来的功能不变还可以使用,代理模式改变原来的功能

倾一世温柔,暖一个最爱的人倾一世温柔,暖一个最爱的人你的留言,满含深情,我的回应,一生真爱,只给你一人!遇见你,如遇见了贵人,你对我的好,好到无可挑剔,我对你的爱,已深入骨髓。倾一世温柔,暖一个最爱的人。爱创业失败尽头生命棺材盖(之7)人!精神层面认知不同目标咋相同?人们为啥会偏见?每个人生存的环境,意识,教养,素质层次层面与生活习惯咋会一样呢?当年的我,认为一会事一样的美女不需拉屎也不拉尿的。长期既往的影响着我区县一把手访谈汪凯加快建设高气质现代化文化旅游名城编者按党的二十大是在全党全国各族人民迈上全面建设社会主义现代化国家新征程向第二个百年奋斗目标进军的关键时刻召开的一次十分重要的大会,对全面建设社会主义现代化国家作出战略部署,为实现秦岚晒澳门出游照,穿黑色皮大衣又酷又美,43岁气质太出众!头条创作挑战赛秦岚在社交平台上晒出一组澳门出游的美照,穿着一身黑色的装扮看上去又酷又美。要说秦岚的衣品是真的很不错,而且,43岁的她将容颜和身材管理得特别好,看上去一点儿都不像是4孕妈妈发飙不爱我身上的病毒就是不喜欢我!隔壁有个孕妈妈阳了,这几天晚上夫妻经常斗嘴,那个女的声音大,北方人,普通话标准,蛮好听的。说的话还有一定道理1老公商量要打胎你休想把我的宝宝打掉,我三次自然流产,好不容易怀上,现在经常被抱和不常被抱的孩子,长大后会有3个明显差异一个周末,我带着孩子去朋友小慧家玩,小慧的宝宝刚满月。刚进门听见宝宝哭了起来,小慧刚准备去抱,被她婆婆阻止了。小慧婆婆说,刚给他检查过,没拉也没尿,也刚吃过奶,没什么事就不要抱,如冬天吃豆,赛过吃肉,建议中老年人常吃这3豆,好吃又营养导语冬天吃豆,赛过吃肉,建议中老年人常吃这3豆,增强免疫力才是最好的防护一餐一饭,心有所栖。柴米油盐,爱有所依。静看一树花开,慢享三餐四季。大家好,我是爱美食更爱生活的晓峰。随着寒心肾不足,所以才记不住东西?只一个中成药,养心滋肾,健脑安神大家好,我是李医生你有没有年纪轻轻,就记忆很差,容易忘事的情况,比如说出门前各种找手机,或者是出门总是怀疑没有锁门,再或者是怀疑没有关燃气,如果有,这多说明你心肾不足了,怎么讲呢?百菜不如白菜,大白菜这样做,好吃不停筷,吃完全身都暖和北方民间有个说法,白菜豆腐保平安。到了天寒地冻的日子,大白菜和豆腐就成了北方人餐桌上最熟悉最常见的蔬菜。虽说如今生活条件好了,不用再储存几百斤大白菜了,但只要去菜市场,肯定会买上两致富瓜中扬瓜蒌全身是宝小产业成就大梦想在武汉市新洲区三店街,瓜蒌产业是特色支柱产业之一。2021年,三店街幸福总支九个村全部种植瓜蒌,连片面积达5500余亩,瓜蒌产业产值达3500万元,带动当地600多名村民就近就业。世界杯决赛时间更新!梅西回应伤病情况,姆巴佩大赞C罗宣战梅西大家好,我是詹妹。北京时间12月18日晚上23点,法国vs阿根廷的决赛时间已经确定,说实话这个时间对于我们中国球迷来说非常友好,可以坐在电视机前观看这场比赛的。与此同时的阿根廷也在
人民币贬值的压力变得更加严重,怎么办呢?在沉重的私人债务负担和房地产市场下滑面前的脆弱性增加了人民银行允许人民币进一步走弱的风险,或者与美元的固定汇率体系完全下降的风险。美元再次反弹,给世界各地的货币带来了压力。值得注意土耳其为何一定要加入上合?陆弃世界的中心向亚洲倾斜文陆弃刚刚在乌兹别克斯坦结束的上合撒马尔罕峰会,土耳其总统埃尔多安是应乌兹别克斯坦总统米尔济约耶夫先生的邀请,作为特邀嘉宾首次参加的。埃尔多安对上海合作组织峰会非常感兴趣,他接受记杰伦格林单打效率超过爱德华兹,火箭选秀意中人两战轰68分7帽尽管杰伦格林上赛季最后阶段展现出了自己的得分爆发力,证明了自己配得上选秀大年2号秀的身份,但仍然有一些美国记者和媒体人在给他挑刺。有人认为格林是在刷数据,没有传球视野和防守能力,没当好科技创新的生力军来源人民网人民日报一粒砂子,能有什么价值?将富含硅元素的砂子熔炼成高纯度的单晶硅,就是制作芯片的原材料。将单晶硅加工成硅晶片,再将上亿根晶体管和数公里长的导线布局其上,最终做成指甲不吃不行,但吃多了就麻烦大了!适量摄入,切勿做咸人我们常见的高盐食品有腌制的食物,如咸菜腌肉,添加了亚硝酸盐的各种熟食和各种含盐调味料。然而真正可怕的并不是这些看得见的高盐食品,而是那些隐藏在食物中的盐,仍然让人防不胜防。下面我来梅核气,咽喉异物感的中医治疗不少朋友有咽喉异物感,也就是吐之不出,咽之不下,有的咽喉干燥,喝水润润好点,不知道是什么病,咋治疗,下面我给大家分析肝肾胃三个脏器的经脉络于咽喉,不舒服也主要有这三个脏器影响导致的出线希望渺茫!U19国足毫无技术,艾菲尔丁停球2米远错失戴帽U20亚洲杯预选赛第一轮比赛,中国u19队赢球了,面对小组第二弱的对手,中国队31击败对手拿到开门红,下一个对手将迎战小组最弱对手马尔代夫,能否拿到2连胜让人关注。从首场比赛的过程爵士新援439带队晋级!骑士这波亏大了?在北京时间9月11日,欧洲篮球锦标赛迎来了16强的比赛,本场比赛芬兰对阵克罗地亚,最终芬兰以9486击败克罗地亚,成功晋级。本场比赛爵士新援马尔卡宁出战32分钟,得到43分9篮板,秋季癌症易复发转移?医生分析了这3个原因来源健康时报健康时报权威健康资讯,因专业而信赖!本文专家李忠,北京中医药大学东直门医院血液肿瘤科主任医师秋季对于癌症患者来说,可以说是多事之秋,因为这个季节更容易导致患有肿瘤神经衰无动力乐园厂家应具备的四大条件如何去选择一个合适的无动力乐园生产厂家?这个问题是很多游乐场老板景区老板都比较注重的一个问题,俗话说方向不对努力白费,选择一个好的设备生产厂家尤为重要。那么如何在众多生产厂家中挑选芒砀山碧峰寺芒砀山碧峰寺盛朝新芒砀山碧峰寺位于虞山西部主峰南侧峭壁中间,该寺庙是古人利用峭壁之间的空隙对附近岩石进行加工而形成的,由于山势陡峻,巉岩峭拔,寺庙有一种凌空飞架的感觉,顾名思义碧峰