2012-03-12 10 views
10

Próbuję zaimplementować wzorzec modułu rozpoznawania, ale nie mogę ujawnić zmodyfikowanej właściwości prywatnej.Ujawnianie zmiennych prywatnych w module modułu ujawniającego

var myRevealingModule = (function(){ 

    var name = 'Diogo'; 

    function setName() { 
     name = name + ' Cardoso'; 
    } 

    return { 
     fullName: name, 
     set: setName 
    }; 

}()); 

// Sample usage: 
myRevealingModule.set(); 
console.log(myRevealingModule.fullName); // "Diogo" instead of the excepted "Diogo Cardoso". 

Odpowiedz

20
return { 
    fullName: name, 
    set: setName 
}; 

który używa wartości od name i setName. Nie tworzy odniesienia do zmiennej. W rzeczywistości kopiowana jest name.

Należy utworzyć odpowiednią metodę getName, aby skorzystać z zamknięć, dzięki czemu można zachować odniesienie do zmiennej.

13
var myRevealingModule = (function(){ 

    var name = 'Diogo'; 

    function setName() { 
     name = name + ' Cardoso'; 
    }; 

    function getName() { 
     return name; 
    }; 

    return { 
     fullName: name, 
     set: setName, 
     get: getName 
    }; 

}()); 

http://jsfiddle.net/yeXMx/

0

Jeśli Twoja wartość jest atrybutem obiektu lub tablicy, możesz wyeksportować obiekt lub tablicę, a eksport będzie odwoływał się do nich, dzięki czemu użytkownicy na zewnątrz zobaczą zaktualizowane zmiany. To trochę ryzykowne, ponieważ ogólny wzorzec eksportu zmiennych ma dychotomię skalarna/kopiowania obiektu/odniesienia.

Powiązane problemy