2013-08-22 73 views
16

我很難找出實現這一點的最佳方式。使用構造函數揭示模塊模式

我想要一個具有構造函數的模塊,該構造函數接受存儲它的參數,以便稍後在模塊中使用。

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,是全球window對象。有人可以解釋我將如何訪問moduleA嗎?我不明白在構造函數之後this.moduleA = moduleA;會發生什麼。我不是一個真正的JavaScript開發,所以如果我在這裏使用了錯誤的花樣什麼的,隨意的附和

+0

我更新了示例以使其更清晰 –

+1

@Chase小提琴作品的唯一原因是因爲'moduleA'是全球性的。 – jbabey

回答

10

你都非常接近,但你在您的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/

+0

感謝你的例子。在我真實世界的情況下,'this'運算符並不總是ModuleB對象(idk,可能是我猜想的糟糕設計)。有沒有什麼我可以在這個實現中改變,以使它適用於這些情況?或者,我會更好地改變實現ModuleB的區域。示例這裏http://jsfiddle.net/QKZxh/1/ –

+2

原型上的函數應該總是有'this'指向調用對象 – jbabey

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

他的原型任務是返回一個IIFE(一個對象),而不是一個函數。 – jbabey

+0

是的,但只要您創建ModuleB它包含一個「原型」。如果覆蓋整個對象,則對moduleA的所有魔法引用都將丟失 –

+0

'moduleA'是每個對象實例的屬性,它與原型無關。 – jbabey

0

您將需要使用呼叫/申請對給定的上下文執行該方法。

試試這個代碼(我已經修改您的代碼)

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

謝謝!