2012-05-07 5 views
1

ここに私のモジュールである新モジュールは

document.getElementById("Button").onclick = function() {  
     var module = new MyModule("input");  
     module.test();  
    } 

このコードを返す:へ

testInside 
testInside 

をconsole.logですが、私が期待しているのは:

testInside  
input  

私は同じクラスの中で新しいクラスをビルドするときに私はC#やjavaのようにします。

答えて

0

strプライベート、あなたはこのようにそれを行うことができます。

MyModule = (function() { 

    var myModule = function MyModule(strInput) { 
     if (false === (this instanceof MyModule)) { 
      return new MyModule(); 
     } 

     var str = strInput; 

     this.getStr = function() { 
      return str; 
     }; 

     this.test = function() { 
      var testModule = new MyModule("testInside"); 
      console.log(testModule.getStr()); 
      console.log(str); 
     }; 
    }; 

    return myModule; 
}()); 

このように、strは内側のクロージャーにあるので、他の言語のインスタンス/オブジェクト変数に似ています。外側のクロージャーに配置すると、静的/クラス変数のようになります。どちらの場合も、myModuleオブジェクトのメソッドは引き続きアクセスできますが、外部からは表示されません。

+0

OK、あなたは私に何かを学んでいますが、私は新しいモジュールを返して外にテストしても同じ問題が発生するので、新しい質問があります。 – Alphapage

+0

testModuleを返すようにテスト関数を変更して、それを呼び出すと奇妙です。 var m1 = new MyModule( 'm1'); var m2 = m1.test(); m1.getStr(); // "m1"を返します m2.getStr(); //返す 'testInside' これは私が期待するものです。他に問題があるかもしれませんか? –

0

strは、MyModuleを返すクロージャ内に格納される変数です。オブジェクトのプロパティではなく、MyModuleのすべてのインスタンスで共有されます。

.test()に電話すると、それを上書きします。

あなたはそれがオブジェクトに関連付けられたことにしたい場合は、そのオブジェクトの上にそれを置く:あなたが残しておきたい場合は

//... 
var myModule = function MyModule(strInput) { 
    // ... 
    this.str = strInput; 
} 
//... 
myModule.prototype.getStr = function() { 
    return this.str; 
//... 
    console.log(testModule.getStr()); 
    console.log(this.str); 
//... 
+0

これは機能しています。ありがとうございました。私が理解すれば、作成されたすべての同一のモジュール間でvarを共有することができ、あるモジュールがvarを変更すると、すべてのモジュールが変更を反映するように更新されますか? – Alphapage

+0

しかしこれは若干異なっています。なぜなら、 'str'は外部から見ることができ、モジュールのクライアントはそれを変更することができるので、カプセル化は失われます。 –

+0

はい、あなたは正しいGeorgiです。私はC#やjavaでstrを非公開にすることは可能ですか? – Alphapage

関連する問題