1. EinleitungTraditionell erstellen Entwickler Eigenschaften in JavaScript-Klassen für alle Daten, die in einer Instanz benötigt werden könnten. Bei kleinen Datenmengen, die im Konstruktor leicht verfügbar sind, ist dies kein Problem. Wenn Sie jedoch einige Daten berechnen müssen, bevor sie in der Instanz verfügbar sind, möchten Sie diese Gebühr möglicherweise nicht im Voraus bezahlen. Betrachten Sie beispielsweise diese Klasse: Klasse MeineKlasse { Konstruktor() { this.data = eine teure Berechnung(); } } Hier wird 2. On-Demand-AttributmodusDie einfachste Möglichkeit, die Ausführung einer aufwändigen Operation zu optimieren, besteht darin, mit der Berechnung zu warten, bis die Daten benötigt werden. Sie können beispielsweise eine Accessor-Eigenschaft mit einem Getter verwenden, um die Berechnung bei Bedarf wie folgt durchzuführen: Klasse MeineKlasse { Daten abrufen() { returniere eine teure Berechnung(); } } In diesem Fall wird Ihre aufwändige Berechnung erst durchgeführt, wenn jemand dieses 3. Unordentliches Lazy-Loading-AttributmusterEin guter Anfang ist, Berechnungen nur durchzuführen, wenn auf eine Eigenschaft zugegriffen wird. Was Sie wirklich wollen, ist, die Informationen nach diesem Punkt zwischenzuspeichern und nur die zwischengespeicherte Version zu verwenden. Aber wo speichern Sie diese Informationen zwischen, um leicht darauf zugreifen zu können? Der einfachste Weg hierfür besteht darin, eine gleichnamige Eigenschaft zu definieren und ihren Wert auf die berechneten Daten festzulegen, und zwar wie folgt: Klasse MeineKlasse { Daten abrufen() { const actualData = einigeExpensiveComputation(); Objekt.defineProperty(diese, "Daten", { Wert: tatsächlicheDaten, beschreibbar: false, konfigurierbar: false, aufzählbar: falsch }); tatsächliche Daten zurückgeben; } } Hier wird die const-Objekt = neue MyClass(); // ruft den Getter auf const data1 = Objekt.Daten; // liest aus der Dateneigenschaft const data2 = Objekt.Daten; Tatsächlich werden alle Berechnungen nur beim ersten Lesen Ein Nachteil dieses Musters besteht darin, dass const-Objekt = neue MyClass(); console.log(object.hasOwnProperty("data")); // falsch const data = Objekt.data; console.log(Objekt.hasOwnProperty("Daten")); // wahr Obwohl dieser Unterschied in vielen Fällen keine Rolle spielt, ist es wichtig, dieses Muster zu verstehen, da es bei der Weitergabe von Objekten zu subtilen Problemen führen kann. Glücklicherweise lässt sich dies mit einem aktualisierten Modell leicht beheben. 4. Einziger Lazy-Loading-Attributmodus der Klasse Wenn Sie einen Anwendungsfall haben, bei dem es wichtig ist, dass die Lazy-Loading-Eigenschaft immer in der Instanz vorhanden ist, können Sie die Eigenschaft im Klassenkonstruktor mit Klasse MeineKlasse { Konstruktor() { Objekt.defineProperty(diese, "Daten", { erhalten() { const actualData = einigeExpensiveComputation(); Objekt.defineProperty(diese, "Daten", { Wert: tatsächlicheDaten, beschreibbar: false, konfigurierbar: false }); tatsächliche Daten zurückgeben; }, konfigurierbar: true, aufzählbar: wahr }); } } Hier verwendet der Konstruktor Anschließend führt die Getter-Funktion die Berechnung durch und ruft const-Objekt = neue MyClass(); console.log(Objekt.hasOwnProperty("Daten")); // wahr const data = Objekt.data; console.log(Objekt.hasOwnProperty("Daten")); // wahr Für Klassen ist dies höchstwahrscheinlich das Muster, das Sie verwenden möchten. Objektliterale ermöglichen dagegen einen einfacheren Ansatz. 5. Muster der Lazy-Loading-Eigenschaft für ObjektliteraleWenn Sie ein Objektliteral anstelle einer Klasse verwenden, ist der Vorgang wesentlich einfacher, da für ein Objektliteral definierte Getter genau wie Dateneigenschaften als aufzählbare eigene Eigenschaften (und nicht als Prototypeigenschaften) definiert werden. Dies bedeutet, dass Sie das chaotische Lazy-Loading-Eigenschaftsmuster für Klassen verwenden können, ohne dass es für Objekte chaotisch wird: const Objekt = { Daten abrufen() { const actualData = einigeExpensiveComputation(); Objekt.defineProperty(diese, "Daten", { Wert: tatsächlicheDaten, beschreibbar: false, konfigurierbar: false, aufzählbar: falsch }); tatsächliche Daten zurückgeben; } }; console.log(Objekt.hasOwnProperty("Daten")); // wahr const data = Objekt.data; console.log(Objekt.hasOwnProperty("Daten")); // wahr VI. FazitDie Möglichkeit, Objekteigenschaften in JavaScript neu zu definieren, bietet eine einzigartige Gelegenheit, Informationen zwischenzuspeichern, deren Berechnung möglicherweise teuer wäre. Indem Sie mit als Dateneigenschaften neu definierten Accessor-Eigenschaften beginnen, können Sie die Berechnung bis zum ersten Lesen der Eigenschaft verschieben und das Ergebnis dann zur späteren Verwendung zwischenspeichern. Dieser Ansatz funktioniert sowohl für Klassen als auch für Objektliterale und ist bei Objektliteralen etwas einfacher, da Sie sich keine Sorgen machen müssen, dass Ihre Getter auf dem Prototyp landen. Eine der besten Möglichkeiten zur Leistungssteigerung besteht darin, die wiederholte Ausführung derselben Arbeit zu vermeiden. So können Sie Ihr Programm jederzeit beschleunigen, wenn Sie Ergebnisse zur späteren Verwendung zwischenspeichern können. Techniken wie das Lazy-Loading-Eigenschaftsmuster ermöglichen es, jede Eigenschaft zu einer Caching-Schicht zu machen und so die Leistung zu verbessern. Oben finden Sie eine kurze Erläuterung der Details des Lazy-Loading-Attributmodus in JavaScript. Weitere Informationen zum JS-Lazy-Loading-Attributmodus finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM! Das könnte Sie auch interessieren:
|
>>: Teilen Sie das Problem, dass Ubuntu 19 die Docker-Quelle nicht installieren kann
Heute ist mein Kollege beim Schreiben von MySQL-A...
In diesem Artikel wird der spezifische Code für d...
1. Node-Server einrichten + Datenbankverbindung D...
1. Einführung in Linux .NET Core Microsoft hat .N...
Vorwort Als einer der besten Webserver der Welt l...
Tomcat definiert intern mehrere ClassLoader, soda...
1. Einleitung Durch Aktivieren des Slow Query Log...
Normalerweise besteht das Ziel beim Erstellen ein...
Bereitstellen des Projekts in der Testumgebung de...
OOM steht für „Out Of Memory“, was so viel bedeut...
1. Übersicht Benutzer erwarten, dass die Webanwen...
Bild herunterladen Docker-Pull MySQL:5.7 docker p...
Überprüfen Sie die Python-Version mit python -V. ...
RGB-Farbtabelle Farbe Englischer Name RGB 16 Farb...
Inhaltsverzeichnis Vorwort Axios-Installation und...