javascript - img - Revelando el patrón del módulo con un constructor
title tag html (3)
Estás muy cerca, pero te falta algo importante en tu definición de someMethod
.
EDIT: es más fácil decir qué funciona y qué no si cambia el nombre de la propiedad del módulo en 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"
Estoy teniendo algunos problemas para descubrir la mejor manera de implementar esto.
Quiero un módulo que tenga un constructor que tome un argumento que lo almacene para su uso posterior dentro del módulo.
var ModuleB = function(moduleA) {
this.moduleA = moduleA;
}
ModuleB.prototype = function() {
//private stuff/functions
function someMethod() {
moduleA.doSomething();
}
//public api
return {
someMethod : someMethod
};
}();
En algun otro archivo
//ModuleA defined elsewhere
var moduleA = new ModuleA();
//...
var module = new ModuleB(moduleA);
module.someMethod();
Ahora arriba en someMethod
, el módulo A no está definido, y this
es el objeto de ventana global. ¿Alguien puede explicar cómo obtendría acceso al módulo A? No entiendo lo que sucede con this.moduleA = moduleA;
tras el constructor. Realmente no soy un desarrollador de JavaScript, así que si estoy usando el patrón equivocado aquí o algo así, siéntete libre de hacer el timbre.
Necesitaría usar call / apply para ejecutar el método para el contexto dado.
Prueba este código (he modificado tu código)
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);
¡Gracias!
Prueba esto:
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();