2009-07-10 14 views

Respuesta

15

hacer algo como:

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

Gracias por su respuesta rápida, ¿Puedo poner más de un método dentro variable pública, probé su modelo pero tengo algunos errores Sintax – krul

+0

pública es sólo un objeto de JS; – BaroqueBobcat

+0

gracias, pero en mi código se niegan a ser tratado como tal, (tendré que depurarlo. Gracias de nuevo y gracias a Daniel por la explicación – krul

0

No sé la respuesta directa, pero que sigue debe trabajo.

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 no es un método público. Es un método en un objeto anónimo que se construye completamente dentro de la declaración de retorno de su función de constructor.

Si quieres llamarlo, ¿por qué no estructurar el objeto de esta manera:

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

Por qué no hacer esto como algo que se puede crear una instancia?

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

Gracias Peter, Lamentablemente ahora tengo mucho código para reescribir el modelo que estoy usando principalmente como espacio de nombres. – krul

+0

¡Genial! ¡Funciona! –

2

¿Este enfoque no es aconsejable? No estoy seguro sin embargo

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