1. Definition
Proxy-Muster: Stellen Sie einen Ersatz oder Platzhalter für ein Objekt bereit, um den Zugriff darauf zu steuern.
Agenten werden unterteilt in: Schutzagenten und virtuelle Agenten
Schutzagent: wird verwendet, um den Zugriff von Objekten mit unterschiedlichen Berechtigungen auf das Zielobjekt zu steuern. Es ist schwierig zu beurteilen, wer auf ein Objekt in JavaScript zugegriffen hat, daher ist der Schutzagent schwierig umzusetzen.
2. Vorabladen von Bildern (das häufigste Anwendungsszenario für virtuelle Agenten)
Das Vorladen von Bildern ist eine gängige Technologie. Wenn Sie das src-Attribut für einen IMG-Tag-Knoten direkt festlegen, bleibt die Bildposition häufig für einen bestimmten Zeitraum leer, weil das Bild zu groß ist oder das Netzwerk schlecht ist. Ein üblicher Ansatz besteht darin, vorab ein Ladebild als Platzhalter zu verwenden und das Bild dann asynchron zu laden. Nachdem das Bild geladen wurde, wird es in den img-Knoten eingefügt.
Umsetzungsprinzip:
Erstellen Sie ein Bildobjekt: var a = new Image();
Definieren Sie den Quellcode des Image-Objekts: a.src = „xxx.gif“;
Dies entspricht dem Zwischenspeichern eines Bildes für den Browser.
Sie können überprüfen, ob das Bild über das vollständige Attribut des Image-Objekts geladen wird. Jedes Bildobjekt verfügt über ein vollständiges Attribut. Wenn sich das Bild im Ladevorgang befindet, ist der Attributwert falsch. Wenn eines der Ereignisse onload, onerror und onabort auftritt, bedeutet dies, dass der Bildladevorgang zu diesem Zeitpunkt abgeschlossen ist. Das vollständige Attribut ist wahr.
(1) Nicht-Proxy-Implementierung
var myImage = (function() { var imgNode = document.createElement("img"); document.body.appendChild(imgNode); var img = new Image(); img.onload = function() { imgNode.src = img.src; }; return { setSrc: function(src) { imgNode.src = "./images/loading.gif"; img.src = src; } } })(); myImage.setSrc("./images/originImg.png");
(2) Proxy-Implementierung
// 创建图片DOM var myImage = (function() { var imgNode = document.createElement("img"); document.body.appendChild(imgNode); return { setSrc: function(src) { imgNode.src = src; } }; })(); // 代理 var proxyImage = (function() { var img = new Image(); img.onload = function() { myImage.setSrc(this.src); // this指向img!img加载完成后,将img.src传递给myImage }; return { setSrc: function(src) { myImage.setSrc("./images/loading.gif"); // loading img.src = src; } }; })(); proxyImage.setSrc("./images/originImg.png");
Angenommen, wir führen eine Dateisynchronisierungsfunktion durch. Wenn das Kontrollkästchen aktiviert ist, wird die entsprechende Datei mit einem anderen Server synchronisiert.
<body> <input type="checkbox" id="1" />文件1 <input type="checkbox" id="2" />文件2 <input type="checkbox" id="3" />文件3 <input type="checkbox" id="4" />文件4 <input type="checkbox" id="5" />文件5 <input type="checkbox" id="6" />文件6 </body>
Lösung: Verwenden Sie eine Proxy-Funktion, um Anfragen innerhalb eines bestimmten Zeitraums zu sammeln und sie dann alle auf einmal an den Server zu senden.
var synchronousFile = function(id) { console.log("开始同步文件,id为:" + id); }; var proxySynchonousFile = (function() { var cache = [], // 保存本次需要同步文件的id timer; // 定时器 return function(id) { cache.push(id); if(timer) { // 不要覆盖已经启动的定时 return; } timer = setTimeout(function(){ synchronousFile(cache.join(",")); clearTimeout(timer); timer = null; cache.length = 0; // 清空缓存 }, 2000); } })(); var checkboxs = document.getElementsByTagName("input"); for(var i = 0, c; c = checkboxs[i]; i++) { c.onclick = function() { if(this.checked === true) { proxySynchonousFile(this.id); } } }
var mult = function() { var result = 1; for(var i = 0, l = arguments.length; i < l; i++) { result= result * arguments[i]; } return result; }; var proxyMult = (function() { var cache = {}; // {"1,2,3": 6} return function() { var args = Array.prototype.join.call(arguments, ","); if(args in cache) { return cache[args]; } return cache[args] = mult.apply(this, arguments); } })(); console.log(proxyMult(1, 2, 3)); // 改造: var proxyFactory = function(fn) { var cache = {}; return function() { var args = Array.prototype.join.call(arguments, ","); if(args in cache) { return cache[args]; } return cache[args] = fn.apply(this, arguments); } }; console.log(proxyFactory(mult)(1, 2, 3));