2012-11-28 22 views
5

Aus einer einzigen Instanz und einer Vielzahl von Instanzen, warum würde ich alle diese zusätzlichen Codezeilen nach dem Modul Muster vs nur mit einem Standard-Konstruktor mit Methoden und Eigenschaften definiert schreiben im Konstruktorkörper?JavaScript-Modul Muster vs Konstruktor mit Methoden im Konstruktor definiert

Modul Pattern Beispiel: http://jsfiddle.net/T3ZJE/1/

var module = (function() { 
    // private variables and functions 
    var foo = 'bar'; 

    // constructor 
    var module = function() { 
    }; 

    // prototype 
    module.prototype = { 
     constructor: module, 
     something: function() { 
     } 
    }; 

    // return module 
    return module; 
})(); 

var my_module = new module(); 

console.log(my_module) 


Constructor Beispiel: http://jsfiddle.net/EuvaS/2/

function Module(){ 

    // private variables and functions 
    var foo = 'bar'; 

    //public methods 
    this.something = function() { 

    }   
} 

var my_module = new Module(); 

console.log(my_module); 

Für mich ist das Ergebnis Ende ist so ziemlich das gleiche. Beide können öffentliche Eigenschaften und Methoden haben, beide können "private" Variablen und Methoden haben, auf die mit den öffentlichen Methoden zugegriffen werden kann.

Beide definieren öffentliche/Prototyp-Methoden einmal für einen Singleton, beide definieren sie mehrfach für mehrere Instanzen/Klone des Objekts.

Fehle ich etwas? Was ist der Unterschied?

Antwort

14

Im ersten Beispiel wird foo eine statische Variable sein, die allen Instanzen von module() gemeinsam ist. Das bedeutet, dass alle Instanzen auf dieselbe Variable verweisen.

Im zweiten Beispiel ist foo für jede Module() - Instanz unterschiedlich.

Abgesehen davon sehe ich keinen Unterschied.

+0

Das ist in der Tat ein wichtiger Unterschied. – Fergal

+1

Für Poops und Kichern, diese leichte Änderung an der Konstruktor-Methode wird statische private vars erstellen UND nur unsere öffentlichen Methoden einmal definieren, während sie auf alle privaten vars im Constructor-Bereich zugreifen können: http://jsfiddle.net/zHwQX/2/ – Fergal

+0

@Fergal guten Punkt, habe ich auch nicht gesehen. Also denke ich insgesamt, mehr Funktionalität und kleinerer Speicherbedarf – Damp

0

Nichts besonderes Unterschied. Aber ich bin nicht sicher, was der Punkt des Modulmusters in diesem Beispiel ist. Sie müssen den Konstruktor nicht in das Modul einschließen. Konstruktoren sollten wie der zweite Stil verwendet werden. Aber es ist besser, wenn die Methoden in ihrem Prototyp-Objekt definiert werden, es sei denn, Sie benötigen es für jede Instanz.

Wieder in Bezug auf den Zweck, ich glaube nicht, dass das Modul Muster hier richtig ist.

+0

Ich habe diesen Ausschnitt von hier: http: //briancray.com/posts/javascript-module-pattern – Fergal

+0

@Fergal Nun, ich bin mir nicht sicher, ob seine Meinung für die Muster. Wie Sie in Ihrer Frage erwähnt haben Konstruktor im Modul ist zusätzliche Arbeit, die unnötig ist, denke ich. Ich kann keinen Verdienst finden. –

Verwandte Themen