Heim Web-Frontend js-Tutorial Erlernen Sie JavaScript-Entwurfsmuster (Kapselung)_Javascript-Kenntnisse

Erlernen Sie JavaScript-Entwurfsmuster (Kapselung)_Javascript-Kenntnisse

May 16, 2016 pm 03:29 PM
javascript 封装 设计模式

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>
Nach dem Login kopieren

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>

Nach dem Login kopieren

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>

Nach dem Login kopieren

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.

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

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

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Offengelegte AMD „Strix Halo' FP11-Gehäusegröße: entspricht Intel LGA1700, 60 % größer als Phoenix Offengelegte AMD „Strix Halo' FP11-Gehäusegröße: entspricht Intel LGA1700, 60 % größer als Phoenix Jul 18, 2024 am 02:04 AM

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

Der Unterschied zwischen Entwurfsmustern und Architekturmustern im Java-Framework Der Unterschied zwischen Entwurfsmustern und Architekturmustern im Java-Framework Jun 02, 2024 pm 12:59 PM

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.

Foxconn baut einen KI-One-Stop-Service auf und investiert in Sharp in den Einstieg in die fortschrittliche Halbleiterverpackung: Produktionsstart im Jahr 2026, ausgelegt für die Produktion von 20.000 Wafern pro Monat Foxconn baut einen KI-One-Stop-Service auf und investiert in Sharp in den Einstieg in die fortschrittliche Halbleiterverpackung: Produktionsstart im Jahr 2026, ausgelegt für die Produktion von 20.000 Wafern pro Monat Jul 18, 2024 pm 02:17 PM

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.

Analyse des Decorator-Musters in Java-Entwurfsmustern Analyse des Decorator-Musters in Java-Entwurfsmustern May 09, 2024 pm 03:12 PM

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.

Praktische Fallanalyse des PHP-Entwurfsmusters Praktische Fallanalyse des PHP-Entwurfsmusters May 08, 2024 am 08:09 AM

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.

Wie Entwurfsmuster mit Herausforderungen bei der Codewartung umgehen Wie Entwurfsmuster mit Herausforderungen bei der Codewartung umgehen May 09, 2024 pm 12:45 PM

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.

Die wunderbare Verwendung des Adaptermusters in Java-Entwurfsmustern Die wunderbare Verwendung des Adaptermusters in Java-Entwurfsmustern May 09, 2024 pm 12:54 PM

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.

PHP-Entwurfsmuster: Testgetriebene Entwicklung in der Praxis PHP-Entwurfsmuster: Testgetriebene Entwicklung in der Praxis Jun 03, 2024 pm 02:14 PM

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.

See all articles