我不清楚private的概念,如果我仍然可以通过public方法访问它并重新定义模块的属性。我的意思是,我完全可以做到:
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'
据我所知,如果我用ES或者const在const中编写它是不可能的,因为它会给我错误尝试覆盖私有变量的值,但它在ES5中有什么意义呢?
答案 0 :(得分:1)
私有变量无法通过拥有私有变量的模块或类之外的代码访问或更改。
例如,您无法aModule.privateVar
并希望它能为您提供任何回报。
你的publicFunction
是什么,Java(和其他编程语言)世界称之为" getter"。简单地说,它允许访问私有变量的值,而不允许对它进行写访问。
在上一个示例中,您实际上并没有覆盖私有变量。您只是在publicFunction
范围内创建新变量并为其指定值。仅仅因为它的名字privateVar
并不意味着它是相同的记忆区域。
我已添加到您的代码中以演示此
var aModule = (function() {
var privateVar = 1;
return {
publicFunction: function() {
return privateVar;
},
getPrivateVar() {
return privateVar;
}
}
})();
aModule.publicFunction = function() {
privateVar = function() {
console.log('a new content');
}
privateVar();
};
aModule.publicFunction(); // 'a new content'
console.log(aModule.getPrivateVar()); //outputs 1

为了详细说明原因,请参阅范围。 privateVar存在于匿名函数的范围内。此匿名函数返回一个对象,其上定义了多个函数。调用该函数时,此对象将分配给aModule,但保留对privateVar的访问权限,因为它们共享范围。
但是,在该功能之外,我们处于不同的范围,除了在返回的对象中公开的变量之外,它们无法访问aModule的变量
答案 1 :(得分:0)
您正在覆盖公共功能,无法访问模块私有变量
考虑以下作为aModule
的属性创建的新功能,该功能仅尝试更改var privateVar
的值
范围不同,因为它被调用的地方并且无法访问该私有变量
var aModule = (function() {
var privateVar = 1;
return {
publicFunction: function() {
return privateVar;
}
}
})();
aModule.newFunction = function() {
// try to change privateVar in aModule
privateVar = 3
};
aModule.newFunction();
console.log(aModule.publicFunction()); //still 1 not 3
// here's where it actually ended up
console.log(window.privateVar)