JavaScript - 从Prototype方法访问私有实例变量

RBR*_*RBR 4 javascript

[是的,我已经阅读了几个类似问题的答案,但没有真正得到我正在寻找的答案,所以无论如何我都会问我的问题.]

在下面的代码中,如何将方法setSecret和tellSecret放在Secret的原型中,同时仍然保持对私有实例变量_secret的访问,并产生相同的输出?

我试过这个(参见jsbin)将方法放在原型中,但改变了输出.

function Secret() {

    // ===== private =====

    var _secret;

    // ===== public =====

    this.setSecret = function (secret) {
        _secret = secret;
    };

    this.tellSecret = function () {
        console.log(_secret);
    };
}

var secretA = new Secret();
var secretB = new Secret();

secretA.setSecret("AAA");
secretB.setSecret("BBB");

setTimeout(function () {
    console.log("Secret A");
    secretA.tellSecret();

    console.log("Secret B");
    secretB.tellSecret();
}, 1000);


// ===== output =====

Secret A
AAA
Secret B
BBB
Run Code Online (Sandbox Code Playgroud)

Sco*_*pey 6

简而言之,您不应该将私有变量与原型方法一起使用.尝试混合两者需要糟糕的解决方法,并且有更好的选择.
这是为什么解释.(这是类似答案的摘录:https://stackoverflow.com/a/21522742/272072)

原型方法

在JavaScript中,原型方法允许多个实例共享原型方法,而不是每个实例都有自己的方法.
缺点是this只有每个原型方法被调用时,那是另一回事.
因此,任何"私人"字段都必须可以访问this,这意味着它们也必须是可公开访问的.因此,我们能做的最好的事情就是坚持使用_private字段的命名约定.

与私有变量混合

当您使用闭包创建私有变量时,除非通过this变量公开,否则无法从原型方法访问它.因此,大多数解决方案只是通过方法公开变量,这意味着您以某种方式公开它.

只需使用_private字段约定

因此,我认为使用_private字段最有意义,即使它们仍然是公开的.它使调试更容易,提供透明度,可以提高性能,这就是我通常使用的.
坚持_private领域的惯例,一切都很好.
我只是不明白为什么JS开发人员努力使字段真正私有化.