Javascript 模块模式中的私有变量
我不清楚private的概念,如果我仍然可以通过public方法访问它并重新定义模块的属性的话。我是说,我完全可以做到:Javascript 模块模式中的私有变量,javascript,design-patterns,module,private,Javascript,Design Patterns,Module,Private,我不清楚private的概念,如果我仍然可以通过public方法访问它并重新定义模块的属性的话。我是说,我完全可以做到: var aModule = (function() { var privateVar = 1; return { publicFunction: function() { return privateVar; } } })(); aModule.publicFunction = funct
var aModule = (function() {
var privateVar = 1;
return {
publicFunction: function() {
return privateVar;
}
}
})();
aModule.publicFunction = function() {
privateVar = function() {
console.log('a new content');
}
privateVar();
};
aModule.publicFunction(); // 'a new content'
我知道如果我用let或const在ES6中编写它,这是不可能的,因为如果试图覆盖私有变量的值,它会给我带来错误,但是它在ES5中有什么意义呢?您正在覆盖公共函数,无法访问模块私有变量 考虑以下作为
aModule
属性创建的新函数,该函数仅尝试更改var privateVar
作用域是不同的,因为它在哪里被调用,并且它不能访问那个私有变量
var aModule=(函数(){
var-privateVar=1;
返回{
publicFunction:function(){
返回privateVar;
}
}
})();
aModule.newFunction=函数(){
//尝试更改aModule中的privateVar
privateVar=3
};
aModule.newFunction();
log(aModule.publicFunction())//还是1不是3
//这就是它真正的结局
console.log(window.privateVar)
私有变量不能被拥有该私有变量的模块或类之外的代码访问或更改
例如,您不能执行aModule.privateVar
并期望它能给您任何回报
您的publicFunction
就是Java(和其他编程语言)世界所称的“getter”。简单地说,它允许访问私有变量的值,而不允许对其进行写访问
在上一个示例中,实际上并没有覆盖私有变量。您只是在publicFunction
的范围内创建一个新变量,并为其赋值。仅仅因为它也被命名为privateVar
,并不意味着它是同一个内存区域
我已经添加到您的代码中来演示这一点
var aModule=(函数(){
var-privateVar=1;
返回{
publicFunction:function(){
返回privateVar;
},
getPrivateVar(){
返回privateVar;
}
}
})();
aModule.publicFunction=函数(){
privateVar=函数(){
log(“新内容”);
}
privateVar();
};
aModule.publicFunction();/'“新内容”
log(aModule.getPrivateVar())//输出1
在javascript中,“私有变量”的概念比较松散。这些变量被认为是私有的,因为它们不能从自身范围之外的范围访问。它们通常以区别字符开头,如\u privateVar
。不,您不能覆盖privateVar
。您所做的是覆盖publicFunction
(使用全局的、不同的“privateVar
”)非常感谢!!是的,就是这样。现在我在我的示例中看到,我的新“privateVar”在全局范围内。我现在明白了:)