这可能吗?
我们确实知道如何在 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/