【发布时间】: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