2013-08-22 12 views
16

これを実装する最良の方法を考え出すのに少し問題があります。コンストラクタを使用したモジュールパターンの表示

モジュール内で後で使用できるように引数を格納するコンストラクタを持つモジュールが必要です。 someMethodで今以上

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

、moduleAは未定義であり、this、グローバルwindowオブジェクトです。誰かが私がmoduleAにアクセスする方法を説明できますか?私はコンストラクタの後にthis.moduleA = moduleA;に何が起こるか理解していません。私はチャイム気軽に、ここで間違っパターンか何かを使用していますので、もし私が本当にjavascriptの開発者ではないよ

+0

例をもっと明確にするように更新しました –

+1

@cfiddleが動作する唯一の理由は、 'moduleA'がグローバルであるためです。 – jbabey

答えて

10

あなたは非常に近いですが、あなたがしていますあなたの定義に何か重要なものがありませんsomeMethod

EDIT:

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オブジェクトではありません。私がこの実装で変更できるものはありますか?あるいは、私は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
あなたが電話を使用する必要があります

/適用されます:あなたはModuleBモジュールプロパティの名前を変更しない場合はどのような動作し、何を伝えることが容易です指定されたコンテキストに対してメソッドを実行します。

このコードを試してみてください(私はあなたのコードを変更した)

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

ありがとう!

関連する問題