首页 > 解决方案 > 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

标签: javascriptoopprivate

解决方案


直接调用 ducky.hatchedEgg(我猜你的意思是这个而不是Bird.hatchedEgg)不会给你任何结果(undefined准确地说)。这就是示例的重点,即不能从外部直接访问私有变量。它们是通过一种方法访问的,而该方法又可能/不能暴露于外部。安全感由此而来。

更新我再次重新阅读了这个问题,你正在做的是:你正在附加一个属性并hatchedEgg为其Bird设置一个值。

Bird.hatchedEgg = 20

但是,这hatchedEgglet hatchedEgg = 10;函数中最初定义的不同。

ducky.getHatchedEggCount();仍然会给您 10.Bird.hatchedEgg将给您20,因为您将属性附加到与函数内部声明的hatchedEgg对象Bird不同。hatchedEggBird

此外,function它是一流的对象,您可以向其添加/删除属性,就像您对任何其他对象所做的那样。但是,在上一篇文章中,我故意尝试区分functionBird和objectBird,以使事情变得清晰。就像说,arraysobjects也是。但是你在谈话中保持一种区分,以便把事情简单化。无论如何,我认为更新它会导致某种混乱。


推荐阅读