javascript - 具有多个实例的原型(prototype)上的私有(private)成员

标签 javascript function scope prototype private-members

这可能吗?

我们确实知道如何在 JavaScript 中模拟私有(private)成员:

var Class = (function() {
    var _private;

    Class = function() {
        _private = {};
    };

    Class.prototype.set = function(name, value) {
        _private[name] = value;
    };

    Class.prototype.get = function(name) {
        return _private[name];
    };

    return Class;

})();

此模式的副作用是,当我创建两个实例时:

var instanceOne = new Class();
var instanceTwo = new Class();

那么私有(private)属性(property)将在以下人员之间共享:

instanceOne.set('test', 'me');
instanceTwo.get('test');

有办法解决这个问题吗?

问候

最佳答案

在 JavaScript 中拥有“私有(private)”成员的标准方法是在构造函数中使用局部变量,并将需要访问它们的任何内容定义为构造函数调用上下文中的闭包,如下所示:

function Class() {
    var privateValue = 0;

    this.getPrivateValue = function() {
        return privateValue;
    };
}
Class.prototype.doSomething = function() {
    // This function doesn't have access to `privateValue`
    // except through `getPrivateValue`, even though
    // it's accessible as a member of the instance
};

很多人都描述过这一点,最著名的可能是 Douglas Crockford .

请注意,这会影响 Class每个实例获取其自己 getPrivateValue 的副本函数,因为每个都是对构造函数的不同调用的闭包(这就是它工作的原因)。 (但这并不意味着该函数的所有代码都是重复的;至少有一些引擎(例如在 Chrome 和其他地方使用的 Google 的 V8 引擎)允许相同的代码 em> 由具有不同关联上下文的多个函数对象共享。)

(旁注:我没有使用 private 这个名称,因为它是一个保留字。在 ES3 中,它是一个“ future 的保留字”;在 ES5 中,它只是严格模式下的一个; details 。)

我在上面使用了一个简单的变量而不是一个对象,以避免使事情看起来比实际情况更复杂。以下是将其应用于您的示例的方式:

function Class() {
    var privateData = {};

    this.get = function(name) {
        return privateData[name];
    };

    this.set = function(name, value) {
        privateData[name] = value;
    };
}

或者,如果您仍然希望在实例之间共享类范围的私有(private)数据:

var Class = function() {
    var dataSharedAmongstInstances;

    function Class() {
        var privateDataForEachInstance = {};

        this.get = function(name) {
            return privateDataForEachInstance[name];
        };

        this.set = function(name, value) {
            privateDataForEachInstance[name] = value;
        };
    }

    return Class;
})();

关于javascript - 具有多个实例的原型(prototype)上的私有(private)成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13099722/

相关文章:

javascript - 使用服务器js中的key从mongo获取数据

javascript - 匹配笑脸图释,但刻度线或三次刻度线之间除外

javascript - 正则表达式为首字母并且它包含一个词

Javascript - 为什么排他性 if 子句中的声明被认为是重复的?

javascript - 当实际结束时播放列表中的下一个 YouTube 视频

php - 找出函数的来源?

c - 如何通过比较 C 中的字符串来检查输入是否有效

javascript - 将函数声明为 var 有什么好处?

c++ - 没有内部作用域的 if 语句?

go - Go中的函数调用函数