更新:这是对我之前的问题的更新,关于这个 StackExchange 的目标,这个问题有点偏离主题。但是我有一个关于之前关于这个主题的询问的后续问题。
对象模型:
var Soldier;
Soldier = (function() {
"use strict";
function Soldier() {
var privateVar = "privateValue";
this.methodToGetPrivateValue = function() {
return privateVar;
}
}
var sharedPrivateVar = "sharedPrivateValue";
function sharedPrivateMethod() {
// I want to get value `privateVar`
}
Soldier.prototype = {
publicVar: "publicValue",
publicMethod: function() {
return this.publicVar;
},
sharedPrivate: function() {
return sharedPrivateVar;
}
}
return Soldier;
})();
var marine = new Soldier();
因此,为了使该主题成为一个更恰当的问题,我更新了一个问题,即是否有办法获得以这种方式定义的 sharedPrivateMethod 以便能够访问上述设置中的私有(private)变量?
我问的原因是 sharedPrivateMethod 对实例化对象是完全不可见的。由于 this.method = function(),实例可以访问 Soldier() 中定义的函数。我不知道它目前是否有任何实际用途,但看看它是否可能以某种方式实现会很有趣。
你所拥有的问题是你的_self
变量被通过new Test
构造的所有实例共享,例如,假设您的 privateMethod
使用了它:
function privateMethod() {
console.log(_self.message);
}
然后这个:
var t1 = new Test();
t1.message = "Message 1";
var t2 = new Test();
t2.message = "Message 2";
t1.privateMethod();
...将记录“消息 2”,而不是您预期的“消息 1”,因为对 new Test
的第二次调用已覆盖 _self_
变量。
除了 _self
变量,您拥有的一切都很好。它让您拥有所有实例共享的私有(private)数据和函数,这非常方便。如果您需要拥有特定于每个实例的真正私有(private)数据,则需要在构造函数本身中创建使用该数据的函数:
function Test() {
var trulyPrivate = 42;
this.showTrulyPrivate = function() {
console.log("trulyPrivate = " + trulyPrivate);
};
}
然后 trulyPrivate
对实例来说是真正私有(private)的。成本是为每个 实例创建showTrulyPrivate
函数的成本。 (函数对象可能能够共享底层代码,一个好的引擎会这样做,但是将是单独的函数对象。)
总结一下:
var Test = (function() {
// Data and functions defined here are private to this code
// and shared across all instances. There is only one copy
// of these variables and functions.
var privateDataSharedByAll;
function privateFunctionSharedByAll() {
}
function Test() {
// Data and functions here are created for *each* instance
// and are private to the instance.
var trulyPrivate;
this.hasAccessToTrulyPrivate = function() {
// Has access to the shared private data *and* the
// per-instance private data.
};
}
return Test;
})();