Heim > Web-Frontend > js-Tutorial > Lernen Sie JavaScript-Entwurfsmuster – Proxy-Muster_Javascript-Kenntnisse

Lernen Sie JavaScript-Entwurfsmuster – Proxy-Muster_Javascript-Kenntnisse

WBOY
Freigeben: 2016-05-16 15:20:24
Original
1093 Leute haben es durchsucht
  • Prominente werden durch Manager vertreten. Wenn Sie eine Berühmtheit bitten, einen kommerziellen Auftritt abzuhalten, können Sie sich nur an seinen Agenten wenden. Der Agent verhandelt die Einzelheiten und die Vergütung des kommerziellen Auftritts und übergibt dann dem Prominenten den Vertrag zur Unterzeichnung.

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");

Nach dem Login kopieren

(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");

Nach dem Login kopieren
Die Vorteile der Verwendung des Proxy-Modus: Jede Funktion wird zu einer Einzelfunktion und das „Prinzip der Einzelverantwortung“ des Objektdesigns wird umgesetzt!

3. Dateisynchronisierung

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>
Nach dem Login kopieren
Es ist offensichtlich unvernünftig, einmal zu synchronisieren, ohne ein Kontrollkästchen zu aktivieren. Denn bei der Webentwicklung sind Netzwerkanfragen der größte Overhead.


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);
    }
  }
}

Nach dem Login kopieren
4. Caching-Proxy – Berechnung des Produkts (die Reihenfolge ist genau die gleiche)

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));
Nach dem Login kopieren
Ich hoffe, dass dieser Artikel für alle hilfreich ist, die JavaScript-Programmierung lernen.
Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage