Frage So verwenden Sie das Enthüllungsmodulmuster in JavaScript


Ich bin über diesen Beitrag gestolpert: JavaScript's Revealing Modul Pattern. Ich würde das gern in meinem Projekt verwenden.

Stellen wir uns vor, ich habe eine Funktion abc und ich rufe diese Funktion in meiner JavaScript-Hauptdatei auf.

Macht dieses Muster die Dinge anders? Kann mir jemand ein einfaches Beispiel für dieses Muster zeigen?


75
2018-04-13 09:46


Ursprung


Antworten:


Ein kleines Beispiel:

var revealed = function(){
   var a = [1,2,3];
   function abc(){
     return (a[0]*a[1])+a[2];
   }

   return {
      name: 'revealed',
      abcfn: abc
   }
}();

in der anonymen Funktion, die initiiert wird, um zu geben revealed ein Wert, a und abc sind für diese Funktion privat. Was die Funktion zurückgibt, ist ein Objektliteral mit einem name Eigentum und a abcfn Eigenschaft, die eine Bezugnahme auf die ist abc function. Das abc function verwendet die private Variable a. Dies alles kann dank der Verwendung von Verschlüsse (alles, was im Rahmen einer Funktion liegt, kann von allen anderen in derselben Funktion referenziert werden).

Aufgedeckte Nutzung:

alert(revealed.name);    //=> 'revealed'
alert(revealed.abcfn()); //=> 5 (1*2+3)

95
2018-04-13 10:00



DC = Douglas Crockford
    RMP = Aufdeckendes Modulmuster

Der Unterschied zwischen DC und RMP ist hauptsächlich organisatorisch / lesbar

Beispiel wird im Artikel selbst vorgestellt? Und was genau fragen Sie, weil diese Dinge nichts mit Akten zu tun haben, sondern eher mit Schließungen?

Sie legen alles in eine Schließung (Funktion) und legen nur den Teil frei, auf den Sie zugreifen möchten. Der Unterschied zwischen DC-Stil und RMP besteht darin, dass in der ersten Funktion Funktionen an verschiedenen Stellen definiert sind, während sie im RMP immer an der gleichen Stelle und anschließend definiert sind aufgedeckt in dem Öffentlichkeit Objektliteral.

Also im DC und RMP hast du:

  • Schließung, die es ermöglicht, private Teile (Variablen und Funktionen) zu definieren
  • privater Teil
  • Öffentliches Ergebnis, das öffentlich sichtbare Funktionen und Variablen definiert (Status)

Diese beiden Muster unterscheiden sich nur in der Lesbarkeit. In DC-Fällen können Sie nicht immer wissen, wo bestimmte Funktionen definiert werden, aber im RMP wissen Sie immer, dass sich alles im privaten Teil befindet.


22
2018-04-13 09:55



Aufschlussreiches Modulmuster ist in. Ziemlich gut beschrieben Wesentliche JavaScript Design Patterns für Anfänger Artikel.


13
2018-04-13 09:53



Die vom Autor "Douglas Crockfords Muster zum Erzeugen von Objekten" genannte Methode ist eigentlich das Modulmuster, das hauptsächlich von Richard Cornford entwickelt wurde et al. Sehen http://groups.google.com/group/comp.lang.javascript/msg/9f58bd11bd67d937 

Wie für Beispiele gibt es viele. Lesen Sie den folgenden Artikel und folgen Sie einigen der Links: http://peter.michaux.ca/articles/module-pattern-provides-no-privacy-at-least-not-in-javascript-tm


6
2018-04-13 10:01



Ich verwende gerne eine Mischung aus der Aufdecken des Modulmusters mit dem Singleton-Muster damit ich strukturierten Code mit den Vorteilen des Modulmusters halten kann:

var MyFunction = function(){

    var _ = {
       Init: function(){
          _.Config.foo = "hello world";
       },
       Config:{
          foo:null
       },
       ShowAlert:function(){
          alert(_.Config.foo);
       }
    }

    return {
        Init: _.Init,
        ShowAlert: _.ShowAlert
    };
}();

MyFunction.Init();
MyFunction.ShowAlert();

Ich habe dazu in meinem Blog mehr Informationen geschrieben:

http://curtistimson.co.uk/js/mixing-revealing-module-and-singleton-javascript-patterns/


1
2018-06-22 12:30



Zu dem Code außerhalb des Moduls macht es wenig Unterschied. In allen drei Fällen in diesem Artikel werden die Methoden auf die gleiche Weise aufgerufen. Aber die Struktur des Moduls selbst ist intern anders.

Crockfords Modulmuster und das, was sie das "aufschlussreiche Modulmuster" nennen, sind strukturell ziemlich identisch. Der einzige Unterschied ist, dass sie die Methode zuerst einer lokalen var zuweisen, um besser lesbar zu sein. Aber es gibt wirklich nichts Besonderes, und Sie haben einige Beispiele in Ihrem Link.


0
2018-04-13 09:54



Das Grundkonzept eines Revealing Moduls ist, dass Sie eine haben Object welche kapselt ein seine Daten und Verhalten:

var Module = (function(){
    var privateStuff = {};
    var publicStuff = {};

    return publicStuff;
})();

Es gibt jedoch einige Best Practices, die Sie verwenden sollten, wenn Sie dieses Muster verwenden. Hier ist ein Modul ("Modulus") mit einigen Eigenschaften zur Demonstration, die einige dieser Praktiken verwendet:

function AbstractSomeClass(id) {
    this.id = id;
    return this;
}

var Modulus = (new (function SomeClass() {
    var thus = this;

    function NameClass(name){
        this.value = thus.name || name;
    }

    AbstractSomeClass.call(this, 998);

    this.name = 'Touring';
    this.name = ( new NameClass('Hofstadter') ).value;

    return {
        id: this.id,
        name: this.name
    };
})());

Beachten Sie die (new (function SomeClass(){ ... })()); Syntax. Verwenden new So können Sie das verwenden this Stichwort Innerhalb von der Schließung. Dies ist praktisch, wenn Sie Eigenschaften von einer anderen Klasse erben müssen (AbstractSomeClass.call(this, 998);) - Sie müssen jedoch immer noch verraten die Eigenschaften, die Sie öffentlich haben möchten, z.

return {
    id: this.id,
    name: this.name
};

Beachten Sie auch, dass wir zuweisen this zu thus - was uns erlaubt, die Eltern-this innerhalb einer Unterklasse, die eine eigene hat this Umfang (this.value = thus.name || name;)

Dies sind nur einige der empfohlenen Konventionen und Best Practices.


0
2017-08-15 20:49



Hier ist das kleine Beispiel für das Aufdecken des Modulmusters.

Es bietet die Möglichkeit, private und öffentliche Funktionen wie a zu deklarieren   class.It ist der Hauptvorteil dieser Muster.Wenn wir nicht belichten wollen   Einige der Funktionen, auf die global zugegriffen werden kann, machen es zu einem privaten und   Rest der Öffentlichkeit machen. Unten ist das Beispiel, wie man privat und öffentlich macht   Funktionen. Und noch ein paar Dinge, es ist ein selbst-ausführbarer Code-Block.

  var Calculator = (function () {

        var num1 = 10;
        var num2=5
        var _abc = function () {
            return num1 - num2;
        };

        var _mulFunc = function () {
            return num1 * num2;
        };

        var _divFunc = function () {
            return num1/num2;
        };

        return {
           //public scope
            abc: _abc,
            mulFunc:_mulFunc
         };

    })();

Alarm (Rechner.abc ()); es gibt 5 zurück

Warnung (Calculator.mulFunc ()); es gibt 50 zurück

Auf __divFunc () kann nicht zugegriffen werden, da es sich im privaten Bereich befindet.   Wir können nur auf die Funktionen zugreifen, die intern deklariert sind Rückkehr   Objekt   wie es ist öffentliche Funktion Darstellung


0
2017-09-24 17:50