javascript - 在 Javascript 中实现私有(private)实例变量

标签 javascript private-members

我不知道我怎么会错过这个这么久。我一直假设私有(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/

相关文章:

c# - 通过 Web API 中的 ModelBinding 将 JavaScript 对象反序列化为 Dictionary<string, string>

php - 在 JS 中下载用 PHP 创建的 ZIP 文件

python - 如何查找所有 Python 内置私有(private)变量,如 __file__、__name__

c++ - 如何让一个方法访问其他模板类实例的私有(private)成员?

javascript - jquery 将 css 设置为不显示后,悬停时显示的下拉菜单不起作用

javascript - AIR HTMLLoader window.open 不起作用

javascript - 类型错误:无法在对象中找到 forEach 函数

python - 为什么我在现实生活中需要私有(private)方法?

Ruby:使用 self 关键字从内部调用私有(private)方法

javascript - 维护私有(private)状态