[是的,我已经阅读了几个类似问题的答案,但没有真正得到我正在寻找的答案,所以无论如何我都会问我的问题.]
在下面的代码中,如何将方法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)
简而言之,您不应该将私有变量与原型方法一起使用.尝试混合两者需要糟糕的解决方法,并且有更好的选择.
这是为什么解释.(这是类似答案的摘录:https://stackoverflow.com/a/21522742/272072)
在JavaScript中,原型方法允许多个实例共享原型方法,而不是每个实例都有自己的方法.
缺点是this是只有每个原型方法被调用时,那是另一回事.
因此,任何"私人"字段都必须可以访问this,这意味着它们也必须是可公开访问的.因此,我们能做的最好的事情就是坚持使用_private字段的命名约定.
当您使用闭包创建私有变量时,除非通过this变量公开,否则无法从原型方法访问它.因此,大多数解决方案只是通过方法公开变量,这意味着您以某种方式公开它.
_private字段约定因此,我认为使用_private字段最有意义,即使它们仍然是公开的.它使调试更容易,提供透明度,可以提高性能,这就是我通常使用的.
坚持_private领域的惯例,一切都很好.
我只是不明白为什么JS开发人员努力使字段真正私有化.
| 归档时间: |
|
| 查看次数: |
4355 次 |
| 最近记录: |