javascript - javascript 中的私有成员是否安全?
问题描述
我正在关注freecodecamp JavaScript oop 课程。本课程描述了如何在对象内部声明一个私有变量,用于无法从外部更改的密码和银行账户等情况。对私有变量的唯一访问是通过可以访问私有变量的公共方法。然后它给出了这个演示代码来说明这一点。
function Bird() {
let hatchedEgg = 10; // private variable
/* publicly available method that a bird object can use */
this.getHatchedEggCount = function() {
return hatchedEgg;
};
}
let ducky = new Bird();
ducky.getHatchedEggCount(); // returns 10
我不明白的是,hatchedEgg 变量如何被称为安全的。作为用户/黑客,我所要做的就是猜测从函数 getHatchedEggCount() 返回的变量名。在这种情况下,hatchedEgg(这对黑客来说并不太难),然后我可以使用这一行来修改私有变量;
Bird.hatchedEgg = 20;
console.log(Bird) // returns { [Function: Bird] hatchedEgg : 20 }
我错过了什么吗?
//-------------- Clarification Edit
显然问题出在 freecodecamp 控制台 (A Bug) 上,它正在更改私有变量的值。如果你愿意,你可以尝试在这个链接中粘贴上面的代码,你会看到。freecodeConsoleLink
解决方案
直接调用 ducky.hatchedEgg
(我猜你的意思是这个而不是Bird.hatchedEgg
)不会给你任何结果(undefined
准确地说)。这就是示例的重点,即不能从外部直接访问私有变量。它们是通过一种方法访问的,而该方法又可能/不能暴露于外部。安全感由此而来。
更新我再次重新阅读了这个问题,你正在做的是:你正在附加一个属性并hatchedEgg
为其Bird
设置一个值。
Bird.hatchedEgg = 20
但是,这hatchedEgg
与let hatchedEgg = 10;
函数中最初定义的不同。
ducky.getHatchedEggCount();
仍然会给您 10.Bird.hatchedEgg
将给您20
,因为您将属性附加到与函数内部声明的hatchedEgg
对象Bird
不同。hatchedEgg
Bird
此外,function
它是一流的对象,您可以向其添加/删除属性,就像您对任何其他对象所做的那样。但是,在上一篇文章中,我故意尝试区分function
Bird和object
Bird,以使事情变得清晰。就像说,array
sobjects
也是。但是你在谈话中保持一种区分,以便把事情简单化。无论如何,我认为更新它会导致某种混乱。
推荐阅读
- swift - 在 Swift 中减少 Result 数组
- c - C中文字类型转换和返回值的奇怪结果
- javascript - 如何在 mobx 商店,react-native 中启用严格模式
- python-3.x - 数据插入错误 10427 参数转换
- r - 如何对矩阵中的值进行子选择,但在 R 中保留它们的原始维度?
- r - 使用 tidymodels 进行数据预处理和重采样
- git - 限制对 git repo 中的文件的访问,例如子模块,没有另一个 repo
- javascript - 未捕获的类型错误:无法设置未定义的属性“回调”
- tensorflow - 在大型 CNN 上实现焦点损失
- ios - 如何在 RealityKit 中显示 ARPlaneGeometry,而不使用 SceneKit?