Выявление шаблона модуля с помощью конструктора

У меня возникли проблемы с поиском наилучшего способа реализовать это.

Я хочу модуль, который имеет конструктор, который принимает аргумент, который хранит его для последующего использования в модуле.

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

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

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

В другом файле

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

//...

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

Теперь, выше в someMethod, moduleA не определен, и this глобальный объект окна. Может кто-нибудь объяснить, как получить доступ к модулю? Я не понимаю, что происходит с this.moduleA = moduleA; после конструктора. Я не разработчик javascript, поэтому, если я использую неправильный шаблон здесь или что-то, не стесняйтесь звонить.

Ответ 1

Вы очень близки, но вам не хватает чего-то важного в вашем определении someMethod.

EDIT: проще сказать, что работает, а что нет, если вы измените имя свойства модуля в 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/

Ответ 2

Попробуй это:

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

Ответ 3

Вам нужно будет использовать call/apply для выполнения метода для заданного контекста.

попробуйте этот код (я изменил ваш код)

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

Благодарю!