2011-12-20 10 views
13

Podczas implementacji wzorca modułu, w jaki sposób funkcje prywatne uzyskują dostęp do prywatnych właściwości modułu? Nie widziałem żadnych przykładów, w których programiści to robią. Czy jest jakiś powód, aby tego nie robić?Wzorzec modułu JavaScript: w jaki sposób metody prywatne mają dostęp do zakresu modułu?

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

Działa dobrze: http://jsfiddle.net/DREKt/ Chociaż prawdopodobnie chcesz poprzedzić '_privateIncrement' deklaracją' var'. – Dennis

+0

jeśli 'liczba' nie była związana w zamknięciu modułu i była częścią obiektu, to może być konieczne użycie' apply() 'lub' call() ', aby wywołać metodę prywatną w odpowiednim kontekście. '_privateIncrement.call (this)' –

Odpowiedz

10

Przy wdrażaniu wzór modułu, w jaki sposób funkcjonuje prywatny dostęp do prywatnych właściwości modułu?

Właściwości są w zasięgu, więc oni "po prostu zrobić"

nie działa.

Tak, robi.

_privateIncrement nie ma dostępu do zasięgu tego modułu.

Tak, robi.

Zobacz live example z następujących czynności:

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 chociaż myślę, że OP mówiąc "_how czy prywatne funkcje uzyskują dostęp do prywatnych właściwości modułu_" próbuje wyjaśnić, że chce uzyskać dostęp do właściwości zwróconego obiektu (np. 'getNumber() 'metoda) z wewnątrz funkcji' _privateIncrement() '. – Tadeck

+0

Quentin ma rację. Miałem błąd w innym miejscu mojego systemu, który wyrzucał prywatną zmienną. Dziękuję Ci. – Thomas

3

Jedną z alternatyw mieć metody prywatne z dostępem do this jest za pomocą call lub apply metod.

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

Oczywiście byłoby przesunąć use_restroom i buy_food do prototypu i private_stuff poza konstruktora jeśli planowaliśmy mający wiele instancji tego obiektu.

Powiązane problemy