【问题标题】:Private variables in JavaScript and their visibilityJavaScript 中的私有变量及其可见性
【发布时间】:2013-07-19 20:54:39
【问题描述】:

考虑一下我在 Chrome 控制台中尝试过的这个简单代码:

function Container() {
    var secret = 3;
    this.getSecret = function() {
        return secret;
    }
}

现在,我无法通过执行来检索 3:

var c1 = new Container();
c1.secret //yields undefined

但是,这按预期工作

c1.getSecret() //returns 3

现在,这是我尝试过的古怪的事情:

c1.secret = 10;
c1.getSecret(); //I was expecting it to return 10

但是,它返回 3。当我在控制台中看到该对象时,它看起来像这样:

Container {getSecret: function, secret: 10}

谁能解释为什么 c1.secret = 10 没有改变对象中秘密私有变量的值?是否有两个名为“secret”的字段?

我很困惑最终对象在内存中的真实样子。

【问题讨论】:

  • 没有。 .secret 是对象的一个​​属性,另一个是私有变量,因为它声明了函数的范围。请记住,JS 中的函数被视为对象!
  • 您可能想在谷歌上搜索“javascript 关闭”。这个概念需要一点时间来适应。
  • 您似乎混淆了变量和属性之间的区别(两个非常不同的东西)。变量 (var secret) 可在它声明的范围内访问(在每个 Container 实例中)。您使用this 设置一个属性(getSecret),该属性与secret 在同一范围内,因此您可以从那里访问它。在您声明 c1 的范围内(我猜是全局的),它无权访问 secret 变量。然后,您使用c1.secret = 10; 在特定实例上动态设置“秘密”属性,控制台输出会显示该属性。
  • 这是关于私有变量和闭包的帖子,希望对您有所帮助:marcelorjava.wordpress.com/2014/06/07/…

标签: javascript prototype private private-members


【解决方案1】:

private 是一个非常令人困惑的词。

您使用var secret = 3; 声明的secret 变量不是“私有”变量。这是一个仅在 Container 构造函数范围内可见的变量。并且因为您在同一范围内声明了方法getSecret,所以它可以访问它。

如果你这样做了:

function Container() {
    var secret = 3;
}

Container.prototype.getSecret = function() {
    return secret;
}

调用 getSecret 会说秘密未定义。

并且,使用您当前的代码,添加:

Container.prototype.getSecret2 = function() {
    return this.secret;
}

将返回 10。因为当您这样做时,您的对象现在有一个名为 secret 的属性

c1.secret = 10;

但请记住:

var secret = 3; 不会将变量附加到当前对象。它只是创建一个存在于当前范围内的变量。在该范围内声明的每个函数都可以访问它。

【讨论】:

  • 我认为最重要的部分是:“var secret = 3;不会将变量附加到当前对象。”
  • 感谢您的解释。你能告诉我如何在对象字面量中创建私有变量或其本质吗?
  • 谢谢你的小提琴,明白了。但我必须说,这并不是那么简单 - 或者我只是很愚蠢:(
猜你喜欢
  • 2011-07-30
  • 1970-01-01
  • 2018-03-20
  • 2014-08-11
  • 2017-06-13
  • 1970-01-01
  • 2013-06-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多