Details zum Prototypmodus des Javascript-Entwurfsmusters

Details zum Prototypmodus des Javascript-Entwurfsmusters

1. Prototyp-Modus

Das Prototypmuster wird verwendet, um die Leistung zu verbessern, den Speicherverbrauch zu reduzieren und Code wiederzuverwenden, indem beim Erstellen eines Objekts die Eigenschaften und Methoden eines Objektprototyps gemeinsam genutzt werden.

Beispiel 1

Funktion Person(Name) {
  dieser.name = Name;

  diese.config = {
    a: "1",
    b: "2",
  };

  dies.hallo = Funktion () {
    console.info("hallo");
  };
}

Wenn Sie mit dem obigen Code 100 Instanzen erstellen müssen, müssen Sie 100 config und 100 hello erstellen, und diese beiden Dinge sind in jeder Instanz genau gleich.

Daher können wir durch Extrahieren gemeinsamer Codes eine Öloptimierung durchführen.

const konfiguration = {
  a: "1",
  b: "2",
};
const hallo = Funktion () {
  console.info("hallo");
};
Funktion Person(Name) {
  dieser.name = Name;

  diese.config = Konfiguration;

  this.hallo = hallo
}

Auf diese Weise müssen unabhängig davon, wie viele Personenobjekte erstellt werden, nur eine config und ein hello erstellt werden. Es bestehen jedoch weiterhin Probleme, beispielsweise die Verunreinigung globaler Variablen, versehentliche Änderungen config , eine starke Kopplung von Person an andere Codes sowie Schwierigkeiten bei der Codeerweiterung und -wartung.

Daher kann eine Optimierung durch Prototyping durchgeführt werden.

Funktion Person() {}
var p = neue Person();


Das Prototypdiagramm dieser Funktion beim Erstellen einer Instanz sieht wie folgt aus:

Beispiel 2

Funktion Person(Name) {
  dieser.name = Name;

  diese.config = {
    a: "1",
    b: "2",
  };

  dies.hallo = Funktion () {
    console.info("hallo");
  };
}

//Diese Methode schreibt den Prototyp neu, wodurch der Konstruktor verloren geht und zu Object() wird.
//Sie können Person.prototype.xx=yy verwenden, um Person.prototype.constructor=Person zu schreiben, oder es neu angeben
Person.Prototyp = {
  Version: 1.0,
  sagen wir: Funktion (Argument) {
    console.info(`${this.name} sagt ${arg}`);
  },
  Konstrukteur: Person,
};
var p1 = neue Person("p1");
var p2 = neue Person("p2");

console.info(p1.config == p2.config); //false
console.info(p1.hallo == p2.hallo); //falsch
konsole.info(p1.say === p2.say); //wahr
p1.sagen("qq");
p2.sagen("qq");
konsole.info(p1.version === p2.version); //wahr
konsole.info(p1.version);

Das Prototypdiagramm dieser Funktion beim Erstellen einer Instanz sieht wie folgt aus:

Beispiel 3

Funktion Person(Name) {
  dieser.name = Name;

  diese.config = {
    a: "1",
    b: "2",
  };

  dies.hallo = funktion () {
    console.info("hallo");
  };
}

//Diese Methode schreibt den Prototyp neu, wodurch der Konstruktor verloren geht und zu Object() wird
Person.Prototyp = {
  Version: 1.0,
  sagen wir: Funktion (Argument) {
    console.info(`${this.name} sagt ${arg}`);
  },
};

Funktion PersonA(Name) {
  Person.call(dieser, Name);
}
PersonA.prototype = Person.prototype;

Funktion PersonB(Name) {
  Person.call(dieser, Name);
}
PersonB.prototype = Person.prototype;
var pA = neue PersonA("pa");
var pB = neue PersonB("pb");

console.info(pA.config == pB.config); //falscher interner Eigenschaftsvergleich console.info(pA.hello == pB.hello); //falscher interner Eigenschaftsvergleich console.info(pA.say === pB.say); //true gemeinsame Nutzung von Prototypmethoden pA.say("qq");
pB.say("qq");
console.info(pA.version === pB.version); //echte gemeinsame Nutzung von Prototyp-Eigenschaften console.info(pA.version); //1.0
Person.prototype.version = 2.0; //Gemeinsame Eigenschaften des Prototyps ändern console.info(pB.version); //2.0
konsole.info(neue Person().version); //2.0

//Ändern Sie die Methode zum Teilen des Prototyps PersonB.prototype.say = function (arg) {
  console.info(`v2--- ${this.name} sagt ${arg}`);
};
pB.say("qq");
neue Person("Person").sagen("ww");

Zusammenfassen:

js verbraucht mehr Speicher und benötigt viel Zeit zum Erstellen von Objekten. Sie können den Speicherverbrauch reduzieren, indem Sie die Erstellung interner Attribute reduzieren.

Der Prototypmodus verwendet die Prototypfunktion der javascript Sprache, um dieselben Eigenschaften gemeinsam zu nutzen, wodurch der Speicherverbrauch reduziert und die Effizienz der Objekterstellung verbessert wird.

2. Beobachtermuster

Das Beobachtermuster wird für die Kommunikation zwischen Modulen und Komponenten verwendet, indem es ein einheitliches Muster für die Ereignisabonnement- und Ereignisveröffentlichung bereitstellt. Dadurch wird eine Entkopplung zwischen Modulen und Komponenten erreicht und die Wartbarkeit des Codes verbessert.

Kommunikationsmethoden zwischen Modulen und Komponenten

Zwischen Modulen und Komponenten wird eine direkte Referenzkommunikation verwendet

const ModulA = {
  sagen Sie: Funktion (Nachricht) {
    console.info("A sagen " + msg);
  },

  letBrun: Funktion () {
    //Direkt auf Modul B verweisen
    moduleB.run();
  },
};

const ModulB = {
  ausführen: Funktion () {
    console.info("B ausführen ");
  },

  letAsay: Funktion () {
    //Direkt auf ModulA verweisen
    moduleA.say("hallo");
  },
};

moduleA.letBrun(); //B Ausführen
moduleB.letAsay(); //A sag Hallo

Die übergeordnete Komponentenkommunikation wird zwischen Modulen und Komponenten verwendet.

const ModulA = {
  sagen Sie: Funktion (Nachricht) {
    console.info("A sagen " + msg);
  },
};

const ModulB = {
  ausführen: Funktion () {
    console.info("B ausführen ");
  },
};

const übergeordnetesModul = {
  ModulA,
  Modul B,

  letBrun: Funktion () {
    dies.moduleB.run();
  },

  letAsay: Funktion () {
    dies.moduleA.say("hallo");
  },
};

parentModule.letBrun(); //B Ausführen
parentModule.letAsay(); //A sag Hallo

Eventmodul realisiert Kommunikation

Funktion Emitter() {
  diese.ereignisse = {};
  this.res_oldAction = {}
  diese.res_action_events = {}
}

//Ressourcen abonnierenEmitter.prototype.subscribe = function (res, action, fn) {
  wenn(!this.res_oldAction[res.name]){
 this.res_oldAction[res.name] = res[Aktion]
 res[Aktion] = (Daten) => {
      this.res_oldAction[res.name](Daten)
   const fns = this.res_action_events[res.name].action;
      für (lass i = 0; i < fns.Länge; i++) {
        fns[i](Daten);
      }
    }
  }
  
  wenn(!this.res_action_events[res.name]){
 this.res_action_events[res.name] = {}
  }
  
  wenn(!this.res_action_events[res.name][Aktion]){
 this.res_action_events[res.name][Aktion] = []
  }
  
  dies.res_action_events[res.name].action.push(fn)
}

//Abonnement kündigen resourcesEmitter.prototype.unsubscribe = function (res, action, fn) {
  const fns = this.res_action_events[res.name].action;
  für (lass i = 0; i < fns.Länge; i++) {
 wenn (fns[i] === fn) {
   fns.splice(i, 1);
   ich--;
 }
  }
}

Emitter.prototype.on = Funktion (Name, fn) {
  wenn (!this.events[name]) {
    diese.events[name] = [];
  }

  dies.events[name].push(fn);
};

Emitter.prototype.remove = Funktion (Name, fn) {
  wenn (!this.events[name]) {
    zurückkehren;
  }

  const fns = diese.events[name];

  für (lass i = 0; i < fns.Länge; i++) {
    wenn (fns[i] === fn) {
      fns.splice(i, 1);
      ich--;
    }
  }
};

Emitter.prototype.fire = Funktion (Name, Daten) {
  wenn (!this.events[name]) {
    zurückkehren;
  }

  const fns = diese.Ereignisse[Name];

  für (lass i = 0; i < fns.Länge; i++) {
    fns[i](Daten);
  }
};

const emitter = neuer Emitter();

//Ereignisse in Modul A registrieren const methodA = (data) => {
  console.info("Modul A hat eine Essensnachricht erhalten:");
  konsole.info(Daten);
};

emitter.on("Essen", MethodeA);

//Ereignisse in Modul B registrieren const methodB = (data) => {
  console.info("Modul B empfängt Lebensmittelnachricht:");
  konsole.info(Daten);
};
emitter.on("Essen", MethodeB);

//Ereignis in Modul C auslösen emitter.fire("food", "Rice is coming");

//Ereignis aus Modul B entfernen emitter.remove("food", methodB);

//Löse das Ereignis in Modul C erneut aus. emitter.fire("food", "Rice is here again");

Die Ausführungsergebnisse sind wie folgt:

Modul A empfängt die Nahrungsnachricht:

Das Essen ist da

Modul B empfängt die Nahrungsnachricht:

Das Essen ist da

Modul A empfängt die Nahrungsnachricht:

Das Essen kommt wieder

Zusammenfassen:

Für die Kommunikation von JS-Komponentenmodulen gibt es grundsätzlich drei Möglichkeiten (direkte Kommunikation, Kommunikation über übergeordnete Komponenten und Kommunikation über Ereignismodule). Das Observer-Muster wird für die Kommunikation zwischen Modulen und Komponenten verwendet. Es bietet ein einheitliches Muster für die Ereignisabonnementierung und -veröffentlichung, wodurch Module und Komponenten entkoppelt und die Wartbarkeit des Codes verbessert werden.

Dies ist das Ende dieses ausführlichen Artikels über das Prototypmuster des Javascript-Entwurfsmusters. Weitere relevante Inhalte zum Javascript-Prototypmuster finden Sie in den vorherigen Artikeln von 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird!

Das könnte Sie auch interessieren:
  • Detaillierte Erklärung des JavaScript-Prototyps und Beispiele
  • Zwei Bilder von JavaScript zum Verständnis der Prototypenkette
  • Details zum JavaScript-Prototyp
  • Detaillierte Erklärung der JavaScript-Prototypenkette
  • Details zum JavaScript-Prototyp und zur Prototypkette
  • Wissen Sie, was ein JavaScript-Prototyp ist?

<<:  Analyse des Funktionsprinzips und des Implementierungsprozesses von Docker Hub

>>:  Analyse zur Lösung des Problems, dass Navicat Premium eine Verbindung zu MySQL 8.0 herstellt und den Fehler „1251“ meldet.

Artikel    

Artikel empfehlen

MySQL implementiert eine Beispielmethode zum Anmelden ohne Kennwort

Spezifische Methode: Schritt 1: Stoppen Sie den M...

Vermeidung von durch Closures verursachten Problemen in JavaScript

Über let, um Probleme durch Schließung zu vermeid...

React DVA-Implementierungscode

Inhaltsverzeichnis dva Verwendung von dva Impleme...

Stellen Sie die Grafana+Prometheus-Konfiguration mit Docker bereit

docker-compose-monitor.yml Version: '2' N...

So schreiben Sie DROP TABLE in verschiedene Datenbanken

So schreiben Sie DROP TABLE in verschiedene Daten...

Grundlegende Anwendungsbeispiele für Listener in Vue

Inhaltsverzeichnis Vorwort 1. Grundlegende Verwen...

Detaillierte Analyse der MySQL-Sperrblockierung

Bei der täglichen Wartung werden Threads häufig b...

Eine kurze Erläuterung zur Verwendung von Slots in Vue

Definition und Verwendung: Verwenden Sie die Slot...

Ausführliche Erläuterung der gespeicherten MySQL-Prozeduren (in, out, inout)

1. Einleitung Es wird seit Version 5.0 unterstütz...

Wofür wird jQuery verwendet? jQuery ist eigentlich ein js-Framework

Einführung in jQuery Die jQuery-Bibliothek kann e...

Beispielcode zur Implementierung eines 3D-Zauberwürfels mit CSS

Lassen Sie uns heute einen einfachen 3D-Zauberwür...