2012-03-12 94 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

如果你的价值是一个对象或数组的属性,你可以导出对象或数组,出口将是引用,以便外部用户将会看到更新的变化。这是一个有点冒险,因为出口变量的一般模式有标/对象复制/参考二分法。