2009-07-10 5 views

risposta

15

fare qualcosa di simile:

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

Grazie per la risposta rapida, Posso mettere più di un metodo all'interno variabile pubblica, ho provato il vostro modello, ma ho alcuni errori sitattici – krul

+0

pubblico è solo un oggetto js; – BaroqueBobcat

+0

grazie, ma nel mio codice rifiutare di essere trattato come uno, (dovrò fare il debug. Grazie ancora e grazie a Daniel per la spiegazione – krul

0

Non so risposta diretta, ma in seguito dovrebbe lavoro.

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 non è un metodo pubblico. È un metodo su un oggetto anonimo che è costruito interamente all'interno dell'istruzione return della funzione del costruttore.

Se si desidera chiamare, perché non strutturare l'oggetto come questo:

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

perché non fare questo come qualcosa che è possibile creare un'istanza?

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

grazie Peter, Sfortunatamente ho molto codice per riscrivere il modello che sto usando principalmente come namespace – krul

+0

Ottimo! Funziona! –

2

Questo approccio non è consigliabile? Non sono sicuro però

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