我不知道我怎么会错过这个这么久。我一直假设私有(private)实例变量可以像这样工作,但事实并非如此。当然,它们是私有(private)的(如非全局的),但变量在实例之间共享。这导致了一些非常令人困惑的错误。
我以为我遵循了一些最好的库实现的最佳实践,但似乎我错过了一些东西。
var Printer = (function(){
var _word;
Printer = function(word){
_word = word;
}
_print = function(){
console.log(_word);
}
Printer.prototype = {
print: _print
}
return Printer;
})();
var a = new Printer("Alex");
var b = new Printer("Bob");
a.print(); //Prints Bob (!)
b.print(); //Prints Bob
我已经看过这篇文章,但它没有描述实现私有(private)实例变量的最佳实践。 (这就是我想要的名字吗?) Method and variable scoping of private and instance variables in JavaScript
我也看过这篇文章,但使用“this”关键字是我以前所做的。因为它不会混淆我试图避免它。这真的是唯一的方法吗? Implementing instance methods/variables in prototypal inheritance
最佳答案
你正在用这个闭包做一些奇怪的事情。 _word
需要在 Printer
函数中声明,不要在匿名闭包中丢失:
function Printer(word) {
var _word = word;
this.print = function () {
console.log(_word);
}
}
var a = new Printer("Alex");
var b = new Printer("Bob");
a.print(); //Prints Alex
b.print(); //Prints Bob
这使 _word
保持私有(private),但代价是在每个 Printer
实例上创建新的 print
函数。为了降低此成本,您公开 _word
并在原型(prototype)上使用单个 print
函数:
function Printer(word) {
this._word = word;
}
Printer.prototype.print = function () {
console.log(this._word);
}
var a = new Printer("Alex");
var b = new Printer("Bob");
a.print(); //Prints Alex
b.print(); //Prints Bob
_word
暴露真的重要吗?就我个人而言,我不这么认为,特别是考虑到 _
前缀。
关于javascript - 在 Javascript 中实现私有(private)实例变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9572029/