2009-07-10 5 views
12

同じオブジェクト内のプライベート1からのパブリックメソッドを呼び出す私はプライベート1内からのパブリックメソッドを呼び出すことができます。Javascriptが

var myObject = function() { 
    var p = 'private var'; 
    function private_method1() { 
     // can I call public method "public_method1" from this(private_method1) one and if yes HOW? 
    } 

    return { 
     public_method1: function() { 
     // do stuff here 
     } 
    }; 
}(); 

答えて

15

ような何か:

var myObject = function() { 
    var p = 'private var'; 
    function private_method1() { 
     public.public_method1() 
    } 

    var public = { 
     public_method1: function() { 
     alert('do stuff') 
     }, 
     public_method2: function() { 
     private_method1() 
     } 
    }; 
    return public; 
}(); 
//... 

myObject.public_method2() 
+0

おかげで、私はパブリック変数内の複数の方法を置くことができますが、私はあなたのモデルを試してみましたが、私はいくつかのsintaxエラーがあるかわからない – krul

+0

国民はただのjsオブジェクトです。 – BaroqueBobcat

+0

ありがとう、私のコードでは、1つのように扱われることを拒否する(私はそれをデバッグする必要があります)説明のためにDanielのおかげで再びありがとう – krul

0

を直接答えを知っているが、以下はいけないはず作業。

var myObject = function() 
{ 
    var p = 'private var'; 
    function private_method1() { 
    _public_method1() 
    } 
    var _public_method1 = function() { 
     // do stuff here 
    } 

    return { 
    public_method1: _public_method1 
    }; 
}(); 
3

public_method1はパブリックメソッドではありません。これは、コンストラクタ関数のreturn文の中に完全に構​​築された匿名オブジェクトのメソッドです。

var myObject = function() { 
    var p... 
    function private_method() { 
     another_object.public_method1() 
    } 
    var another_object = { 
     public_method1: function() { 
      .... 
     } 
    } 
    return another_object; 
}() ; 
14

は、なぜあなたはインスタンス化できるものとしてこれを行いません。

あなたはそれを呼び出すようにしたい場合は、なぜこのようなオブジェクトを構築しませんか?

function Whatever() 
{ 
    var p = 'private var'; 
    var self = this; 

    function private_method1() 
    { 
    // I can read the public method 
    self.public_method1(); 
    } 

    this.public_method1 = function() 
    { 
    // And both test() I can read the private members 
    alert(p); 
    } 

    this.test = function() 
    { 
    private_method1(); 
    } 
} 

var myObject = new Whatever(); 
myObject.test(); 
+0

感謝のピーター、残念なことに私は今多くのコードを私がほとんど名前空間として使用しているモデルを書き換えるために持っています。 – krul

+0

素晴らしいです! –

2

このアプローチはお勧めできませんか?私はあなたの速い答えを

var klass = function(){ 
    var privateMethod = function(){ 
    this.publicMethod1(); 
    }.bind(this); 

    this.publicMethod1 = function(){ 
    console.log("public method called through private method"); 
    } 

    this.publicMethod2 = function(){ 
    privateMethod(); 
    } 
} 

var klassObj = new klass(); 
klassObj.publicMethod2();