在Javascript中实现私有实例变量

我不知道我已经错过了这么久了。我一直假设私有实例变量是这样工作的,但是它们没有。它们是私有的(如非全局),但是这些变量在实例之间是共享的。这导致了一些非常混乱的错误。

我以为我是遵循一些最好的图书馆实施的最佳做法,但似乎我错过了一些。

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

我已经看过这篇文章,但它并没有描述实现私有实例变量的最佳做法。 (这甚至是我想要的名字吗?)
Method and variable scoping of private and instance variables in JavaScript

我也看过这个帖子,但是使用’this’关键字是我以前做的。因为它不会模糊,我试图避免它。这真的是唯一的办法吗?
Implementing instance methods/variables in prototypal inheritance

你正在做这些关闭的一些蛮横的东西。 _word需要在打印机功能中声明,不会丢失在匿名关闭的地方:

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私有化,牺牲在每个打印机实例上创建新的打印功能。为了降低这个成本,您将暴露_word并在原型上使用单个打印功能:

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暴露真的很重要吗?就个人而言,我不这么认为,特别是给_ _前缀。

http://stackoverflow.com/questions/9572029/implementing-private-instance-variables-in-javascript

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:在Javascript中实现私有实例变量