2012-03-12 67 views
10

我試圖實現透露出模塊模式,但我無法暴露修改的私有財產暴露私有變量。揭示模塊模式

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". 

回答

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

即使用namesetName。它不會創建對變量的引用。實際上,name被複制。

您需要創建相應的getName方法,採取封閉的優勢,這樣就可以保持一個變量的引用。

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

如果你的價值是一個對象或數組的屬性,你可以導出對象或數組,出口將是引用,以便外部用戶將會看到更新的變化。這是一個有點冒險,因爲出口變量的一般模式有標/對象複製/參考二分法。