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 empfehlen

So konfigurieren Sie inländische Quellen in CentOS8 yum/dnf

CentOS 8 hat das Installationsprogramm für Softwa...

Installationstutorial für MySQL 5.1 und 5.7 unter Linux

Das Betriebssystem für die folgenden Inhalte ist:...

Fallstudie zu JavaScript-Style-Objekten und CurrentStyle-Objekten

1. Stilobjekt Das Stilobjekt stellt eine einzelne...

Detaillierte Analyse des Linux-Kernel-Makros container_of

1. Wie oben erwähnt Ich habe dieses Makro gesehen...

Installationsmethode der dekomprimierten Version von MySQL 5.7.18 unter Win7x64

Weiterführende Literatur: Beheben Sie das Problem...

base target="" gibt das Ziel des Basislinks zum Öffnen des Frames an

<base target=_blank> ändert den Zielrahmen d...

Ein paar Dinge zu favicon.ico (am besten im Stammverzeichnis ablegen)

Öffnen Sie eine beliebige Webseite, zum Beispiel ...

CSS zur Erzielung einer kompatiblen Textausrichtung in verschiedenen Browsern

Beim Front-End-Layout des Formulars müssen wir hä...

Über das Problem der dynamischen Spleißen der SRC-Bildadresse von img in Vue

Werfen wir einen Blick auf das dynamische Spleiße...

Grafisches Tutorial zur Installation von CentOS7 auf VMware 15.5

1. Erstellen Sie eine neue virtuelle Maschine in ...

Wie gut wissen Sie über die Vererbung in JavaScript?

Inhaltsverzeichnis Vorwort Die Beziehung zwischen...