2013-08-22 8 views
16

Ich habe ein wenig Mühe, herauszufinden, wie dies am besten umgesetzt werden kann.Enthüllung des Modulmusters mit einem Konstruktor

Ich möchte ein Modul, das einen Konstruktor hat, der ein Argument übernimmt, das es für die spätere Verwendung innerhalb des Moduls speichert.

var ModuleB = function(moduleA) { 
    this.moduleA = moduleA; 
} 

ModuleB.prototype = function() { 
    //private stuff/functions 
    function someMethod() { 
     moduleA.doSomething(); 
    } 

    //public api 
    return { 
     someMethod : someMethod 
    }; 
}(); 

In einer anderen Datei nun über

//ModuleA defined elsewhere 
var moduleA = new ModuleA(); 

//... 

var module = new ModuleB(moduleA); 
module.someMethod(); 

in someMethod ist moduleA undefiniert und this, ist das globale Fensterobjekt. Kann mir jemand erklären, wie ich Zugang zu ModulA bekomme? Ich verstehe nicht, was mit this.moduleA = moduleA; nach dem Konstruktor passiert. Ich bin nicht wirklich ein Javascript-Entwickler so, wenn ich das falsche Muster hier oder etwas bin mit, fühlen Sie sich frei in läuten

+0

Ich aktualisierte das Beispiel, um es klarer zu machen –

+1

@Chase der einzige Grund, dass Geige funktioniert, ist, weil 'moduleA' global ist. – jbabey

Antwort

10

Sie sind ganz in der Nähe, aber du bist in Ihrer Definition von someMethod fehlt etwas wichtiges.

EDIT: ist leichter zu sagen, was funktioniert und was nicht, wenn Sie den Namen der Moduleigenschaft in ModuleB ändern:

var ModuleA = function() {} 

ModuleA.prototype = (function() { 
    return { 
     someMethod: function() { 
      return 'foo'; 
     } 
    }; 
}()); 

var ModuleB = function(moduleA) { 
    this.innerModule = moduleA; 
} 

ModuleB.prototype = (function() { 
    return { 
     doStuff: function() { 
      return this.innerModule.someMethod(); 
     } 
    }; 
}()); 

var moduleA = new ModuleA(); 

var moduleB = new ModuleB(moduleA); 
console.log(moduleB.doStuff()); // prints "foo" 

http://jsfiddle.net/mN8ae/1/

+0

danke für Ihr Beispiel. In meiner realen Situation ist der "This" -Operator nicht immer das ModulB-Objekt (idk, wahrscheinlich schlechtes Design von mir, denke ich). Gibt es etwas, das ich in dieser Implementierung ändern könnte, um es für diese Fälle einzusetzen? Oder wäre es besser, wenn ich die Bereiche ändere, die ModuleB implementieren? Beispiel Hier http://jsfiddle.net/QKZxh/1/ –

+2

Funktionen auf dem Prototyp sollte immer 'this' Punkt auf das aufrufende Objekt haben – jbabey

1

Versuchen Sie folgendes:.

var ModuleB = function(moduleA) { 
    this.moduleA = moduleA; 
} 

// Simplifying your code, what was missin is the "this" keyword accessing the moduleA 
ModuleB.prototype.someMethod = function() {  
    this.moduleA.doSomething(); 
}; 


var module1 = new ModuleB({ 
    doSomething: function(){ 
     alert('i do something'); 
    } 
}); 

module1.someMethod(); 
+1

Seine Prototyp-Zuweisung ist die Rückkehr eines IIFE (ein Objekt), keine Funktion. – jbabey

+0

Ja, aber sobald Sie ModuleB erstellt haben, enthält es einen "Prototyp". Wenn Sie das gesamte Objekt überschreiben, gehen alle magischen Referenzen auf moduleA verloren –

+0

'moduleA' ist eine Eigenschaft jeder Objektinstanz, sie hat nichts mit dem Prototyp zu tun. – jbabey

0

Sie benötigen würden Aufruf verwenden/apply um die Methode für einen gegebenen Kontext auszuführen.

versuchen diesen Code (Ich habe Ihren Code geändert)

var ModuleB = function(moduleA) { 
    this.moduleA = moduleA; 
     }; 

ModuleB.prototype = function() { 
    //private stuff/functions 
    function someMethod() { 

     this.doSomething(); 
    } 

    //public api 
    return { 
     someMethod : someMethod 
    }; }(); 


var ModuleA=function(){ 
    this.doSomething=function(){ 
     alert('moduleA Method'); 
    }; }; 

var modA=new ModuleA(); var modB=new ModuleB(modA); 
modB.someMethod.call(modA); 

Dank!

Verwandte Themen