2011-12-20 11 views
13

Al implementar el patrón del módulo, ¿cómo acceden las funciones privadas a las propiedades privadas del módulo? No he visto ejemplos donde los desarrolladores hagan esto. ¿Hay alguna razón para no hacerlo?Patrón de módulo de JavaScript: ¿Cómo acceden los métodos privados al alcance del módulo?

var module = (function(){ 
    // private property 
    var number = 0; 

    // private method 
    _privateIncrement = function(){ 
     // how do I access private properties here? 
     number++; 
    }; 

    // public api 
    return { 
     // OK 
     getNumber: function(){ 
      return number; 
     }, 
     // OK 
     incrNumber: function(){ 
      number++; 
     }, 
     // Doesn't work. _privateIncrement doesn't have 
     // access to the module's scope. 
     privateIncrNumber: function(){ 
      _privateIncrement(); 
     } 
    }; 
})(); 
+7

Funciona bien: http://jsfiddle.net/DREKt/ Aunque es probable que desee anteponer '_privateIncrement' con una declaración' var'. – Dennis

+0

si 'number' no estaba vinculado en el cierre del módulo, y era parte del objeto, entonces podría necesitar usar' apply() 'o' call() 'para invocar el método privado en el contexto correcto. '_privateIncrement.call (this)' –

Respuesta

10

Al implementar el patrón módulo, ¿cómo eventos privados acceda a las propiedades privadas del módulo?

Las propiedades están en su alcance, por lo que "simplemente lo hacen"

no funciona.

Sí, lo hace.

_privateIncrement no tiene acceso al alcance del módulo.

Sí, lo hace.

Ver live example de los siguientes:

var module = (function(){ 
    // private property 
    var number = 0; 

    // global method 
    _privateIncrement = function(){ 
     number++; 
    }; 

    // public api 
    return { 
     // OK 
     getNumber: function(){ 
      return number; 
     }, 
     // OK 
     incrNumber: function(){ 
      number++; 
     }, 
     // Does work! 
     privateIncrNumber: function(){ 
      _privateIncrement(); 
     } 
    }; 
})(); 

// Show default value 
document.body.innerHTML += (module.getNumber()); 
// Increment 
module.privateIncrNumber(); 
// Show new value 
document.body.innerHTML += (module.getNumber()); 
// Increment (since _privateIncrement was defined as a global!) 
_privateIncrement(); 
// Show new value 
document.body.innerHTML += (module.getNumber()); 

// Output: 012 
+1

+1 aunque creo que OP diciendo "_cómo las funciones privadas acceden a las propiedades privadas del módulo_" trata de explicar que él/ella quiere acceder a las propiedades del objeto devuelto (por ejemplo, 'getNumber() 'método) desde la función' _privateIncrement() '. – Tadeck

+0

Quentin tiene razón. Tenía un error en otro lugar de mi sistema que arrojaba la variable privada. Gracias. – Thomas

3

Una alternativa a tener métodos privados con acceso a la this es mediante el uso de los métodos call o apply.

function Restaurant() 
{ 
    this.mongoose = 'beans'; 
    this.freedom = {bear:'love',a:'12'}; 

    var myPrivateVar; 

    var private_stuff = function() // Only visible inside Restaurant() 
    { 
     myPrivateVar = "I can set this here!"; 
     this.mongoose = 12; 
    } 

    this.use_restroom = function() // use_restroom is visible to all 
    { 
     private_stuff(); 
    } 

    this.buy_food = function() // buy_food is visible to all 
    { 
     private_stuff(); 
    } 

    private_stuff.call(this); 
} 

var bobbys = new Restaurant(); 

Por supuesto que le mueva el use_restroom y buy_food a un prototipo y private_stuff fuera del constructor si estuviera pensando en tener múltiples instancias de este objeto.

Cuestiones relacionadas