阅读以下文章后, http://javascriptplayground.com/blog/2012/04/javascript-module-pattern/ 我决定开始在我的JS中实现模块。
不幸的是,我使用的模块似乎并没有将私有变量保密,
var popoverOptionsModule = (function() {
var _stopAskingList = [];
var addToStopAskingList = function(itemToAdd) {
if (_stopAskingList.indexOf(itemToAdd) === -1){
_stopAskingList.push(itemToAdd);
}
}
var getStopAskingList = function() {
return _stopAskingList;
}
return {
addToStopAskingList: addToStopAskingList,
getStopAskingList: getStopAskingList,
};
})();
popoverOptionsModule._stopAskingList = 4;
console.log(popoverOptionsModule._stopAskingList);
如您所见,我可以更改值 popoverOptionsModule._stopAskingList并将更新记录到控制台......我认为这不应该发生。谢谢你的帮助!
答案 0 :(得分:2)
JS是完全动态类型的,所以当你有行
时popoverOptionsModule._stopAskingList = 4;
您刚刚创建了此变量并为其分配了值,因此下一行成功的原因。如果你没有这一行,那么后续的console.log将报告未定义。这段代码也可以使用
popoverOptionsModule._abc = 4;
console.log(popoverOptionsModule._abc);
请记住,这实际上并不是一个私有变量,就像OO语言实现保护级别一样,而只是一种试图将其隐藏在调用者之外的API模式。