2

考虑一下我在 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”的字段?

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

4

1 回答 1

4

private真是一个令人困惑的词。

您声明使用的secretvarvar secret = 3;不是“私有”变量。这是一个仅在 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;不将变量附加到当前对象。它只是创建一个存在于当前范围内的变量。在该范围内声明的每个函数都可以访问它。

于 2013-07-19T21:03:41.187 回答