使用构造函数显示模块模式



我很难找到实现这一点的最佳方法。

我想要一个具有构造函数的模块,该构造函数接受一个参数,该参数存储该模块以供以后在模块中使用。

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是全局窗口对象。有人能解释一下我将如何访问模块A吗?我不明白this.moduleA = moduleA;在构造函数之后会发生什么。我不是一个真正的javascript开发人员,所以如果我在这里使用了错误的模式或其他什么,请随意加入。

您非常接近,但在someMethod的定义中遗漏了一些重要内容。

编辑:如果您在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/

试试这个:

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

您需要使用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);

谢谢!

最新更新