2013-08-22 12 views
16

Sto riscontrando un po 'di problemi nel trovare il modo migliore per implementarlo.Modello modulo rivelatore con un costruttore

Desidero un modulo che abbia un costruttore che accetta un argomento che lo memorizza per un uso successivo all'interno del modulo.

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

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

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

In qualche altro file

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

//... 

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

Ora sopra someMethod, moduleA è indefinito, e this, è l'oggetto della finestra globale. Qualcuno può spiegare come ottenere l'accesso al modulo A? Non capisco cosa succede a this.moduleA = moduleA; dopo il costruttore. In realtà non sono uno sviluppatore javascript quindi se sto usando il modello sbagliato o qualcosa, sentitevi liberi di carillon in

+0

Ho aggiornato l'esempio per rendere più chiaro –

+1

@Chase l'unica ragione per cui funziona fiddle è perché 'moduleA' è globale. – jbabey

risposta

10

Vi sono molto vicino, ma sei manca qualcosa di importante nella tua definizione di someMethod.

EDIT: si è più facile dire cosa funziona e cosa non lo fa se si cambia il nome della proprietà del modulo in ModuleB:

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

grazie per il tuo esempio. Nella mia situazione del mondo reale, l'operatore "questo" non è sempre l'oggetto ModuleB (idk, probabilmente un disegno povero da parte mia, immagino). C'è qualcosa che potrei cambiare in questa implementazione per farlo funzionare in quei casi? O starei meglio cambiando le aree che implementano ModuleB. Esempio Qui http://jsfiddle.net/QKZxh/1/ –

+2

le funzioni sul prototipo dovrebbero sempre avere "questo" punto sull'oggetto chiamante – jbabey

1

provare questo:.

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

Il suo prototipo è il ritorno di un IIFE (un oggetto), non una funzione. – jbabey

+0

Sì ma, non appena creato ModuleB contiene un "prototipo". Se si sovrascrive l'intero oggetto, tutto il riferimento magico al moduloA andrà perso –

+0

'moduleA' è una proprietà di ogni istanza di oggetto, non ha nulla a che fare con il prototipo. – jbabey

0

Lei avrebbe bisogno di utilizzare chiamata/apply per eseguire il metodo per un dato contesto.

provare questo codice (ho modificato il codice)

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); 

Grazie!

Problemi correlati