


Erlernen Sie JavaScript-Entwurfsmuster (Kapselung)_Javascript-Kenntnisse
In JavaScript gibt es keine Unterstützung für abstrakte Klassen und Schnittstellen. Auch JavaScript selbst ist eine schwach typisierte Sprache. JavaScript kann oder muss nicht viel mehr tun, wenn es um die Kapselung von Typen geht. Für die Implementierung von Entwurfsmustern in JavaScript ist die Nichtunterscheidung von Typen eine Schande und kann auch als Erleichterung bezeichnet werden.
Aus der Perspektive der Designmuster spiegelt sich die Verpackung in Verpackungsänderungen auf einer wichtigeren Ebene wider.
Durch die Kapselung von Änderungen isolieren wir die stabilen Teile des Systems von den Teilen, die sich leicht ändern lassen. Während der Entwicklung des Systems müssen wir nur die Teile ersetzen, die leicht zu ändern sind Ja, es ist relativ einfach auszutauschen. Dadurch kann die Stabilität und Skalierbarkeit des Programms weitestgehend gewährleistet werden.
Es gibt drei grundlegende Modi der JavaScript-Kapselung:
1. Verwenden Sie das Prinzip der Vereinbarungspriorität und alle privaten Variablen beginnen mit _
<script type="text/javascript"> /** * 使用约定优先的原则,把所有的私有变量都使用_开头 */ var Person = function (no, name, age) { this.setNo(no); this.setName(name); this.setAge(age); } Person.prototype = { constructor: Person, checkNo: function (no) { if (!no.constructor == "string" || no.length != 4) throw new Error("学号必须为4位"); }, setNo: function (no) { this.checkNo(no); this._no = no; }, getNo: function () { return this._no; setName: function (name) { this._name = name; }, getName: function () { return this._name; }, setAge: function (age) { this._age = age; }, getAge: function () { return this._age; }, toString: function () { return "no = " + this._no + " , name = " + this._name + " , age = " + this._age; } }; var p1 = new Person("0001", "小平果", "22"); console.log(p1.toString()); //no = 0001 , name = 小平果 , age = 22 p1.setNo("0003"); console.log(p1.toString()); //no = 0003 , name = 小平果 , age = 22 p1.no = "0004"; p1._no = "0004"; console.log(p1.toString()); //no = 0004 , name =小平果 , age = 22 </script>
Haben Sie nach dem Lesen des Codes das Gefühl, betrogen worden zu sein? Wenn Sie einfach alle Variablen eingeben, die mit _ beginnen, kann dies natürlich als Kapselung bezeichnet werden hat Vorrang.
Bei dieser Verwendung des Unterstrichs handelt es sich um eine bekannte Namenskonvention, die darauf hinweist, dass eine Eigenschaft nur für die interne Verwendung des Objekts bestimmt ist und der Zugriff oder die direkte Festlegung darauf zu unerwarteten Konsequenzen führen kann. Dies trägt dazu bei, zu verhindern, dass Programmierer es versehentlich verwenden, es verhindert jedoch nicht, dass es absichtlich verwendet wird.
Diese Methode ist immer noch gut. Zumindest sind die Getter- und Setter-Methoden im Prototyp enthalten, nicht im Objekt. Insgesamt ist es eine gute Wahl. Wenn Sie der Meinung sind, dass dies nicht möglich ist und die Kapselung strikt implementiert werden muss, schauen Sie sich die zweite Methode an.
2. Implementieren Sie die Kapselung strikt
<script type="text/javascript"> /** * 使用这种方式虽然可以严格实现封装,但是带来的问题是get和set方法都不能存储在prototype中,都是存储在对象中的 * 这样无形中就增加了开销 */ var Person = function (no, name, age) { var _no , _name, _age ; var checkNo = function (no) { if (!no.constructor == "string" || no.length != 4) throw new Error("学号必须为4位"); }; this.setNo = function (no) { checkNo(no); _no = no; }; this.getNo = function () { return _no; } this.setName = function (name) { _name = name; } this.getName = function () { return _name; } this.setAge = function (age) { _age = age; } this. getAge = function () { return _age; } this.setNo(no); this.setName(name); this.setAge(age); } Person.prototype = { constructor: Person, toString: function () { return "no = " + this.getNo() + " , name = " + this.getName() + " , age = " + this.getAge(); } } ; var p1 = new Person("0001", "小平果", "22"); console.log(p1.toString()); //no = 0001 , name =小平果 , age = 22 p1.setNo("0003"); console.log(p1.toString()); //no = 0003 , name = 小平果 , age = 22 p1.no = "0004"; console.log(p1.toString()); //no = 0003 , name = 小平果 , age = 22 </script>
Wie unterscheidet sich dies von anderen Modi zum Erstellen von Objekten, über die wir zuvor gesprochen haben? Im obigen Beispiel verwenden wir immer das Schlüsselwort this, wenn wir die Eigenschaften eines Objekts erstellen und referenzieren. In diesem Beispiel deklarieren wir diese Variablen mit var. Dies bedeutet, dass sie nur im Person-Konstruktor vorhanden sind. Die checkno-Funktion wird auf die gleiche Weise deklariert und wird daher zu einer privaten Methode.
Methoden, die auf diese Variablen und Funktionen zugreifen müssen, müssen nur in Person deklariert werden. Diese Methoden werden als privilegierte Methoden bezeichnet, da sie öffentlich sind, aber Zugriff auf private Eigenschaften und Methoden haben. Um von außerhalb des Objekts auf diese privilegierten Funktionen zugreifen zu können, wird ihnen das Schlüsselwort this vorangestellt. Da diese Methoden im Bereich des Person-Konstruktors definiert werden, haben sie Zugriff auf private Eigenschaften. Auf diese Eigenschaften wird ohne Verwendung des Schlüsselworts this verwiesen, da sie nicht öffentlich sind. Alle Getter- und Zuweisungsmethoden wurden so geändert, dass sie ohne dies direkt auf diese Eigenschaften verweisen.
Jede Methode, die keinen direkten Zugriff auf private Eigenschaften erfordert, kann wie ursprünglich in Person.prototype deklariert werden. Wie die toString()-Methode. Nur Methoden, die direkten Zugriff auf private Mitglieder erfordern, sollten als privilegierte Methoden konzipiert werden. Aber zu viele privilegierte Methoden beanspruchen zu viel Speicher, da jede Objektinstanz eine neue Kopie aller privilegierten Methoden enthält.
Sehen Sie sich den obigen Code an, der Attributname wurde entfernt und die Kapselung wurde nur über Getter und Setter implementiert. Es gibt jedoch ein Problem. was den Speicheraufwand erhöht.
3. Eingekapselt in einem Verschluss
<script type="text/javascript"> var Person = (function () { //静态方法(共享方法) var checkNo = function (no) { if (!no.constructor == "string" || no.length != 4) throw new Error("学号必须为4位"); }; //静态变量(共享变量) var times = 0; //return the constructor. return function (no, name, age) { console.log(times++); // 0 ,1 , 2 var no , name , age; //私有变量 this.setNo = function (no) //私有方法 { checkNo(no); this._no = no; }; this.getNo = function () { return this._no; } this.setName = function (name) { this._name = name; } this.getName = function () { return this._name; } this.setAge = function (age) { this._age = age; } this.getAge = function () { return this._age; } this.setNo(no); this.setName(name); this.setAge(age); } })(); Person.prototype = { constructor: Person, toString: function () { return "no = " + this._no + " , name = " + this._name + " , age = " + this._age; } }; var p1 = new Person("0001", "小平果", "22"); var p2 = new Person("0002", "abc", "23"); var p3 = new Person("0003", "aobama", "24"); console.log(p1.toString()); //no = 0001 , name = 小平果 , age = 22 console.log(p2.toString()); //no = 0002 , name = abc , age = 23 console.log(p3.toString()); //no = 0003 , name = aobama , age = 24 </script>
Der obige Code führt nach dem Laden der JS-Engine direkt die Funktion „Person = sofortige Ausführung“ aus, und diese Funktion gibt dann eine Unterfunktion zurück, bei der es sich um den Konstruktor handelt, der von der neuen Person aufgerufen wird, und weil die Unterfunktion verwaltet wird Ein Verweis auf checkNo(no) und times in der Funktion zur sofortigen Ausführung (offensichtlicher Abschluss), sodass checkNo und times allen Person-Objekten gemeinsam sind. Nach dem Erstellen von drei Objekten sind die Zeiten 0, 1 bzw. 2. Der Vorteil dieses Ansatzes besteht darin, dass die Methoden und Eigenschaften, die in Person wiederverwendet werden müssen, privat gemacht und von Objekten gemeinsam genutzt werden können.
Die privaten Mitglieder und privilegierten Mitglieder werden hier weiterhin im Konstruktor deklariert. Der Konstruktor hat sich jedoch von einer gewöhnlichen Funktion in eine Inline-Funktion geändert und wird der Variablen Person als Rückgabewert der Funktion übergeben, die sie enthält. Dadurch wird ein Abschluss erstellt, in dem Sie statische private Mitglieder deklarieren können. Das Paar leerer Klammern nach der äußeren Funktionsdeklaration ist sehr wichtig. Seine Funktion besteht darin, die Funktion auszuführen, sobald der Code geladen wird. Der Rückgabewert dieser Funktion ist eine andere Funktion, die der Variablen Person zugewiesen wird, sodass Person zum Konstruktor wird. Diese innere Funktion wird beim Instanziieren von Person aufgerufen. Die äußere Funktion wird lediglich zum Erstellen eines Abschlusses verwendet, der zum Speichern statischer Elemente verwendet werden kann.
In diesem Beispiel ist checkno als statische Methode konzipiert, da es keinen Sinn macht, für jede Instanz von Person eine neue Kopie dieser Methode zu generieren. Es gibt auch ein statisches Attribut times, dessen Funktion darin besteht, die Gesamtzahl der Aufrufe des Person-Konstruktors zu verfolgen.
Das Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, er wird für das Studium aller hilfreich sein. Sie können mehr über die Bedeutung der Kapselung erfahren.

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen



Diese Website berichtete am 9. Juli, dass die Prozessoren der AMD Zen5-Architektur „Strix“ über zwei Verpackungslösungen verfügen werden: Der kleinere StrixPoint wird das FP8-Paket verwenden, während der StrixHalo das FP11-Paket verwenden wird. Quelle: videocardz source @Olrak29_ Die neueste Enthüllung ist, dass die FP11-Gehäusegröße von StrixHalo 37,5 mm * 45 mm (1687 Quadratmillimeter) beträgt, was der LGA-1700-Gehäusegröße der AlderLake- und RaptorLake-CPUs von Intel entspricht. AMDs neueste Phoenix APU verwendet eine FP8-Gehäuselösung mit einer Größe von 25*40 mm, was bedeutet, dass StrixHalos F

Im Java-Framework besteht der Unterschied zwischen Entwurfsmustern und Architekturmustern darin, dass Entwurfsmuster abstrakte Lösungen für häufige Probleme beim Softwaredesign definieren und sich dabei auf die Interaktion zwischen Klassen und Objekten konzentrieren, beispielsweise Fabrikmuster. Architekturmuster definieren die Beziehung zwischen Systemstrukturen und Modulen und konzentrieren sich auf die Organisation und Interaktion von Systemkomponenten, wie z. B. eine geschichtete Architektur.

Laut Nachrichten dieser Website vom 11. Juli berichtete die Economic Daily heute (11. Juli), dass die Foxconn Group in den Bereich Advanced Packaging eingestiegen sei und sich auf die aktuelle Mainstream-Halbleiterlösung Panel-Level Fan-out Packaging (FOPLP) konzentriert. 1. Nach seiner Tochtergesellschaft Innolux kündigte auch Sharp, an dem die Foxconn Group beteiligt ist, seinen Einstieg in den japanischen Bereich der Fan-out-Verpackung auf Panelebene an und wird voraussichtlich im Jahr 2026 in Produktion gehen. Die Foxconn Group selbst verfügt über ausreichend Einfluss im KI-Bereich und kann durch den Ausgleich ihrer Mängel bei der fortschrittlichen Verpackung „One-Stop“-Dienste anbieten, um die Annahme weiterer Bestellungen von KI-Produkten in Zukunft zu erleichtern. Laut öffentlichen Informationen auf dieser Website hält die Foxconn Group derzeit 10,5 % der Sharp-Aktien. Die Gruppe gab an, dass sie ihre Anteile zum jetzigen Zeitpunkt weder erhöhen noch reduzieren und ihre Anteile beibehalten wird.

Das Dekoratormuster ist ein strukturelles Entwurfsmuster, das das dynamische Hinzufügen von Objektfunktionen ermöglicht, ohne die ursprüngliche Klasse zu ändern. Es wird durch die Zusammenarbeit von abstrakten Komponenten, konkreten Komponenten, abstrakten Dekoratoren und konkreten Dekoratoren implementiert und kann Klassenfunktionen flexibel erweitern, um sich ändernden Anforderungen gerecht zu werden. In diesem Beispiel werden Milch- und Mokka-Dekoratoren zu Espresso für einen Gesamtpreis von 2,29 $ hinzugefügt, was die Leistungsfähigkeit des Dekoratormusters bei der dynamischen Änderung des Verhaltens von Objekten demonstriert.

1. Factory-Muster: Trennen Sie Objekterstellung und Geschäftslogik und erstellen Sie Objekte bestimmter Typen über Factory-Klassen. 2. Beobachtermuster: Ermöglicht Subjektobjekten, Beobachterobjekte über ihre Zustandsänderungen zu benachrichtigen, wodurch eine lose Kopplung und ein Beobachtermuster erreicht werden.

Entwurfsmuster lösen Herausforderungen bei der Codewartung, indem sie wiederverwendbare und erweiterbare Lösungen bereitstellen: Beobachtermuster: Ermöglicht Objekten, Ereignisse zu abonnieren und Benachrichtigungen zu erhalten, wenn sie auftreten. Factory-Muster: Bietet eine zentralisierte Möglichkeit, Objekte zu erstellen, ohne auf konkrete Klassen angewiesen zu sein. Singleton-Muster: stellt sicher, dass eine Klasse nur eine Instanz hat, die zum Erstellen global zugänglicher Objekte verwendet wird.

Das Adaptermuster ist ein strukturelles Entwurfsmuster, das die Zusammenarbeit inkompatibler Objekte ermöglicht. Es wandelt eine Schnittstelle in eine andere um, sodass die Objekte reibungslos interagieren können. Der Objektadapter implementiert das Adaptermuster, indem er ein Adapterobjekt erstellt, das das angepasste Objekt enthält, und die Zielschnittstelle implementiert. In einem praktischen Fall kann der Client (z. B. MediaPlayer) über den Adaptermodus Medien im erweiterten Format (z. B. VLC) abspielen, obwohl er selbst nur normale Medienformate (z. B. MP3) unterstützt.

TDD wird verwendet, um hochwertigen PHP-Code zu schreiben. Die Schritte umfassen: Testfälle schreiben, die erwartete Funktionalität beschreiben und sie zum Scheitern bringen. Schreiben Sie Code so, dass nur die Testfälle ohne übermäßige Optimierung oder detailliertes Design erfolgreich sind. Nachdem die Testfälle bestanden wurden, optimieren und überarbeiten Sie den Code, um die Lesbarkeit, Wartbarkeit und Skalierbarkeit zu verbessern.
