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 函數里去進行校驗和攔截,確保一部分變量是安全的。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/65723.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/65723.shtml
英文地址,請注明出處:http://en.pswp.cn/web/65723.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

uniapp 之 uni-forms校驗提示【提交的字段[‘xxx‘]在數據庫中并不存在】解決方案

目錄 場景問題代碼結果問題剖析解決方案 場景 uni-forms官方組件地址 使用uniapp官方提供的組件&#xff0c;某個表單需求&#xff0c;單位性質字段如果是高校&#xff0c;那么工作單位則是高校的下拉選擇格式&#xff0c;單位性質如果是其他的類型&#xff0c;工作單位則是手動…

深度學習知識點:RNN

文章目錄 1.簡單介紹2.網絡結構3.應對梯度消失 1.簡單介紹 循環神經網絡&#xff08;RNN&#xff0c;Recurrent Neural Network&#xff09;是一類用于處理序列數據的神經網絡。與傳統網絡相比&#xff0c;變化不是特別大&#xff0c;不如CNN的變化那么大。 為什么要有循環神經…

(leetcode算法題)287. 尋找重復數(經典題目,二分解法)

如果一個題目限定了數據范圍是[1, n]內的整數&#xff0c;那么這個題目可以思考的就是 nums[i]和 i 的關系&#xff0c;769. 最多能完成排序的塊 這個題就使用到了子數組中最大值和 連續[0, n - 1]的關系 而對于本題來說&#xff0c;也可以思考[1, n] 和 nums[i] 的關系&…

獲得PostgreSQL中級認證后,可以從事哪些工作崗位?

獲得 PostgreSQL 中級認證后&#xff0c;可以獲得的崗位 數據庫管理類 數據庫管理員&#xff08;DBA&#xff09;&#xff1a;負責 PostgreSQL 數據庫的日常維護、監控、備份與恢復、性能優化、安全管理等工作。確保數據庫的穩定運行和數據的安全性、完整性&#xff0c;及時處理…

4.1、二纖單向、二纖雙向、四纖雙向,網絡級保護

1、線性復用段保護&#xff08;LMSP&#xff09; 就像是給網絡業務傳輸準備的一個 “保險”。在 SDH 和 MSTP 網絡里&#xff0c;業務信號要通過一段一段的路&#xff08;復用段&#xff09;來傳輸&#xff0c;LMSP 就是為了保證這些路出問題的時候&#xff0c;業務還能正常走。…

【spark源碼修改】hive3.1.3 spark3.5.4編譯,需要修改源碼,最終編譯成功

【spark源碼修改】hive3.1.3 spark3.5.4編譯,需要修改源碼,最終編譯成功 1. 準備安裝包與maven編譯環境1.1 安裝環境準備1.2 修改pom1.3 打包命令2. 編譯與問題解決2.1 開始編譯 失敗, 缺包pentaho-aggdesigner-algorithm:pom:5.1.5-jhyde2.2 Hive Spark Remote Client 模塊…

SQL-leetcode-584. 尋找用戶推薦人

584. 尋找用戶推薦人 表: Customer -------------------- | Column Name | Type | -------------------- | id | int | | name | varchar | | referee_id | int | -------------------- 在 SQL 中&#xff0c;id 是該表的主鍵列。 該表的每一行表示一個客戶的 id、姓名以及推…

【數據庫】一、數據庫系統概述

文章目錄 一、數據庫系統概述1 基本概念2 現實世界的信息化過程3 數據庫系統內部體系結構4 數據庫系統外部體系結構5 數據管理方式 一、數據庫系統概述 1 基本概念 數據&#xff1a;描述事物的符號記錄 數據庫&#xff08;DB&#xff09;&#xff1a;長期存儲在計算機內的、…

Scala語言的面向對象編程

Scala語言的面向對象編程 面向對象編程&#xff08;Object-Oriented Programming&#xff0c;OOP&#xff09;是一種編程范式&#xff0c;它使用“對象”來組織代碼&#xff0c;這些對象能夠包含數據&#xff08;屬性&#xff09;以及功能&#xff08;方法&#xff09;。Scala…

【JVM-2.1】如何使用JMC監控工具:詳細步驟與實戰指南

Java Mission Control&#xff08;JMC&#xff09;是Oracle提供的一個高級圖形化監控工具&#xff0c;專為Java應用程序的性能分析和故障排查設計。JMC不僅提供了實時監控功能&#xff0c;還支持飛行記錄器&#xff08;Flight Recorder&#xff09;功能&#xff0c;能夠記錄JVM…

QT c++ 樣式 設置 標簽(QLabel)的漸變色美化

上一篇文章中描述了按鈕的純色&#xff0c;本文描述標簽的漸變色美化。 1.頭文件 #ifndef WIDGET_H #define WIDGET_H #include <QWidget> //#include "CustomButton.h"#include <QVBoxLayout> #include <QLinearGradient> #include <QLabel…

設計模式 行為型 觀察者模式(Observer Pattern)與 常見技術框架應用 解析

觀察者模式&#xff08;Observer Pattern&#xff09;是一種行為設計模式&#xff0c;它定義了一種一對多的依賴關系&#xff0c;讓多個觀察者對象同時監聽某一個主題對象。這個主題對象在狀態發生變化時&#xff0c;會通知所有觀察者對象&#xff0c;使它們能夠自動更新。 一…

03_Redis基本操作

1.Redis查詢命令 1.1 官網命查詢命令 為了便于學習Redis,官方將其用于操作不同數據類型的命令進行了分類整理。你可以通過訪問Redis官方網站上的命令參考頁面https://redis.io/commands來查閱這些分組的命令,這有助于更系統地理解和使用Redis的各項功能。 1.2 HELP查詢命令…

system securiry: supervisor password required

報錯解釋&#xff1a; 這個錯誤表明系統安全模塊&#xff08;如SELinux或AppArmor&#xff09;需要超級用戶&#xff08;通常是root&#xff09;的密碼來確認一個操作。這通常發生在嘗試進行某些需要高級權限的系統更改時。 解決方法&#xff1a; 如果你擁有root權限&#xff0…

Ubuntu 如何查看盤是機械盤還是固態盤

在 Ubuntu 系統中&#xff0c;您可以通過以下方法來確定硬盤是機械硬盤&#xff08;HDD&#xff09;還是固態硬盤&#xff08;SSD&#xff09;&#xff1a; 使用 lsblk 命令&#xff1a; 打開終端&#xff0c;輸入以下命令&#xff1a; lsblk -d -o name,rota該命令將列出所…

探索式測試

探索式測試是一種軟件測試風格&#xff0c;它強調獨立測試人員的個人自由和職責&#xff0c;為了持續優化其工作的價值&#xff0c;將測試學習、測試設計、測試執行和測試結果分析作為相互支持的活動&#xff0c;在整個項目實現過程中并行地執行。 選擇合適的探索式測試方法我…

uniapp 微信小程序內嵌h5實時通信

描述&#xff1a; 小程序webview內嵌的h5需要向小程序實時發送消息&#xff0c;有人說postMessage可以實現&#xff0c;所以試驗一下&#xff0c;結果是實現不了實時&#xff0c;只能在特定時機后退、組件銷毀、分享時小程序才能接收到信息&#xff08;小程序為了安全等考慮做了…

php 使用simplexml_load_string轉換xml數據格式失敗

本文介紹如何使用php函數解析xml數據為數組。 <?php$a <xml><ToUserName><![CDATA[ww8b77afac71336111]]></ToUserName><FromUserName><![CDATA[sys]]></FromUserName><CreateTime>1736328669</CreateTime><Ms…

HOW - Form 表單 label 和 wrapper 對齊場景

一、背景 在日常使用 表單 時&#xff0c;我們一般有如下布局&#xff1a; 可以通過 Form 表單提供的配置直接設置&#xff1a; <Formform{form}labelCol{{ span: 4 }}wrapperCol{{ span: 20 }}onFinish{handleSubmit}><Form.Itemlabel"輸入框"name"…

深入探索AI核心模型:CNN、RNN、GAN與Transformer

在人工智能的飛速發展中&#xff0c;眾多深度學習模型和算法不斷涌現&#xff0c;推動了許多領域的進步。特別是在圖像識別、自然語言處理、生成建模等方向&#xff0c;AI模型的應用越來越廣泛。本文將介紹幾種最常用的AI模型&#xff0c;包括卷積神經網絡&#xff08;CNN&…