Analysieren des Musters "Modul" in JavaScript

Viele Programmiersprachen verfügen über Mechanismen, um beispielsweise Methoden und Eigenschaften von Klassen auszublenden. In JavaScript sind keine Tools integriert, mit denen solche Effekte ohne zusätzlichen Aufwand erzielt werden können. Solche Dinge können jedoch mit anderen Sprachfunktionen nachgeahmt werden.

Bild

Das Material, dessen Übersetzung wir heute veröffentlichen, ist der Analyse des Entwurfsmusters „Modul“ gewidmet, mit dem Sie private Informationen in Fehlern verbergen und nur auf das zugreifen können, was der Entwickler veröffentlicht hat. Dieser Artikel richtet sich hauptsächlich an Programmierer für Anfänger - für diejenigen, die mit Dingen wie Verschlüssen und IIFE vertraut zu sein scheinen, diese aber noch nicht sehr sicher verwendet haben.

IIFE


Sie können den Gültigkeitsbereich von Variablen in JavaScript mithilfe des Moduls "Modul" steuern. Um einen privaten Bereich zu erstellen, können Sie den Abschluss verwenden. Wie Sie wissen, erstellen Funktionen ihren eigenen Bereich, dessen Inhalt vom globalen Bereich getrennt ist:

(function () { //      })(); 

Vor uns liegt die sogenannte selbstaufrufende Funktion ( IIFE , Sofort aufgerufener Funktionsausdruck, sofort Funktionsausdruck genannt). Eine solche Funktion wird unmittelbar nach ihrer Deklaration ausgeführt. Es ist zweckmäßig, solche Funktionen zu verwenden, um ein bestimmtes Problem zu lösen, das nur einmal gelöst werden muss, ohne dass im globalen Bereich etwas überflüssig bleibt. Innerhalb dieser Funktion (sowie innerhalb anderer Funktionen) wird ein privater Bereich erstellt, auf den von außen nicht zugegriffen werden kann. Das heißt, wenn eine andere Funktion in diesem Bereich deklariert ist, ist nach Ausführung von IIFE kein Zugriff darauf möglich.

 (function () { var myFunction = function () {   //     }; })(); 

Versuchen myFunction , über den Haupttext des Programms auf die Funktion myFunction zuzugreifen:

 myFunction(); // Uncaught ReferenceError: myFunction is not defined 

Wie Sie sehen können, führt dieser Aufruf erwartungsgemäß zu einem Fehler. Dies sagt uns, dass diese Funktion in dem Bereich, von dem aus wir versuchen, darauf zuzugreifen, nicht verfügbar ist. Tatsächlich wird in den beiden obigen Beispielen nichts Nützliches getan. Wir brauchen diese Beispiele nur, um uns auf die Analyse des "Modul" -Musters vorzubereiten.

Rückgabe eines Objekts aus dem IIFE- und API-Modul


Wie kann sichergestellt werden, dass auf eine in einer anderen Funktion deklarierte Funktion weiterhin zugegriffen werden kann? In der Tat werden wir jetzt über das "Modul" -Muster sprechen. Betrachten Sie das folgende Beispiel.

 //   var Module = (function () { return {   myMethod: function () {     console.log('myMethod has been called.');   } }; })(); //      Module.myMethod(); 

Möglicherweise stellen Sie fest, dass hier dasselbe IIFE wie zuvor verwendet wird. Jetzt wird jedoch ein Objekt mit einer Methode von der Funktion zurückgegeben, auf die über den globalen Bereich zugegriffen werden kann. Diese Methode kann natürlich nicht aufgerufen werden. Es ist zu beachten, dass wir in diesem Beispiel die Schließfunktionen nicht verwenden. Wir werden im Folgenden darauf eingehen.

Ein von IIFE zurückgegebenes Objekt ist ein gewöhnliches Objekt, das viele Methoden und Eigenschaften haben kann. Sie bilden eine öffentliche Schnittstelle oder Modul-API.

 //   var Module = (function () { return {   myMethod: function () {   },   someOtherMethod: function () {   } }; })(); //      Module.myMethod(); Module.someOtherMethod(); 

Private Variablen und Funktionen, die im Abschluss gespeichert sind


Jetzt ist es Zeit, über private Variablen und Funktionen zu sprechen. Beispielsweise können einige Hilfsfunktionen den Betrieb der internen Mechanismen des Moduls sicherstellen.

Dies können temporäre Variablen oder Variablen sein, die die Rolle der Speicherung bestimmter Daten spielen, auf die wir den Zugriff genau kontrollieren möchten. Wir sind an einem solchen Gerätemodul interessiert, wenn nur das, was der Außenwelt zur Verfügung stehen soll, und alles andere verborgen ist. Tatsächlich wird alles, was in unserem Beispiel außerhalb des von IIFE zurückgegebenen Objekts deklariert wird, privat.

 var Module = (function () { var privateMethod = function () { }; return {   publicMethod: function () {   } }; })(); 

Die publicMethod Methode aus diesem Beispiel kann von außen aufgerufen werden, die privateMethod Funktion privateMethod nicht, da sie sich in einem privaten Bereich befindet, in einem Abschluss. Genau solche Funktionen, die von außen nicht zugänglich sind, können die Rolle von Hilfsmechanismen von Modulen spielen. Sie können verwendet werden, um interne Datenstrukturen zu verwalten, bestimmte Dienste aufzurufen und in anderen Situationen.

Wenn Sie mit solchen Funktionen arbeiten, müssen Sie berücksichtigen, dass auf sie von anderen Funktionen aus zugegriffen werden kann, die im selben Bereich deklariert sind, einschließlich der Methoden des von IIFE zurückgegebenen Objekts, und auch nachdem der Befehl return dieses Objekt zurückgegeben hat . Das heißt, öffentliche Methoden haben Zugriff auf private Funktionen, sie können mit ihnen interagieren, aber im globalen Bereich sind diese privaten Funktionen nicht verfügbar.

 var Module = (function () { var privateMethod = function () { }; return {   publicMethod: function () {     //       privateMethod,      :     // privateMethod();   } }; })(); 

Dank dessen können wir den Code vor unbefugten Eingriffen schützen und den globalen Geltungsbereich vor Verschmutzung schützen. Wenn dies nicht getan wird, kann einerseits der Betrieb der internen Mechanismen von Modulen versehentlich oder absichtlich gestört werden, da externer Code auf Funktionen oder Variablen verweist, auf die er nicht zugreifen sollte. Wenn Sie dagegen den hier beschriebenen Ansatz nicht verwenden, fallen viele unnötige Dinge in den globalen Bereich, was beispielsweise zu Namenskonflikten führen kann.

Hier ist ein Beispiel für ein von IIFE zurückgegebenes Objekt, das öffentliche Methoden enthält und auf private Funktionen zugreifen kann:

 var Module = (function () { var myModule = {}; var privateMethod = function () { }; myModule.publicMethod = function () { }; myModule.anotherPublicMethod = function () { }; return myModule; //      })(); //   Module.publicMethod(); 

Benennung privater und öffentlicher Funktionen


Es gibt eine Vereinbarung, nach der am Anfang der Namen privater Funktionen ein Unterstrich gesetzt wird. Dies ermöglicht nur durch Betrachten des Codes zu verstehen, welche Funktionen intern und welche öffentlich verfügbar sind. Zum Beispiel könnte es so aussehen:

 var Module = (function () { var _privateMethod = function () { }; var publicMethod = function () { }; return {   publicMethod: publicMethod, } })(); 

Zusammenfassung


In diesem Artikel haben wir ein einfaches "Modul" -Muster untersucht, mit dem Sie mithilfe eines Verschlusses, der aus einem sofort aufgerufenen Funktionsausdruck besteht und von einem Objektausdruck zurückgegeben wird, öffentliche Methoden sowie private Funktionen und Datenstrukturen erstellen können, die nicht direkt von außen bedient werden können. Mit dieser Vorlage können Sie die Implementierungsdetails von Modulen ausblenden, um sie vor versehentlichen oder absichtlichen Änderungen zu schützen, und den globalen Bereich sauber halten.

Liebe Leser! Verwenden Sie das Modul "Modul" in Ihren JS-Projekten?

Source: https://habr.com/ru/post/de419997/


All Articles