JavaScript OOP私有变量
更新:这是对我上一个问题的更新,这个问题与StackExchange的目标有些脱节。但是我有一个关于这个问题的后续问题 对象模型:JavaScript OOP私有变量,javascript,oop,class,prototype,Javascript,Oop,Class,Prototype,更新:这是对我上一个问题的更新,这个问题与StackExchange的目标有些脱节。但是我有一个关于这个问题的后续问题 对象模型: var Soldier; Soldier = (function() { "use strict"; function Soldier() { var privateVar = "privateValue"; this.methodToGetPrivateValue = function() {
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,以便能够访问上述设置中的私有变量
我询问的原因是sharedPrivateMethod对实例化对象完全不可见。由于this.method=function(),实例可以访问在Soldier()中定义的函数。我不知道它目前是否有任何实际用途,但我很想看看它是否有可能。你所拥有的问题是,你的
\u self
变量被通过新测试构建的所有实例共享,因此,例如,假设你的私有方法使用它:
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
的第二次调用已覆盖\u self
变量
除了\u self
变量之外,您所拥有的一切都很好。它让您拥有所有实例共享的私有数据和函数,这非常方便。如果需要具有特定于每个实例的真正私有数据,则需要创建在构造函数本身中使用该数据的函数:
function Test() {
var trulyPrivate = 42;
this.showTrulyPrivate = function() {
console.log("trulyPrivate = " + trulyPrivate);
};
}
然后,trulyPrivate
对实例来说是真正私有的。成本是为每个实例创建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;
})();
这是在javascript中执行OOP的典型方法。请注意,您的private
变量是private static
。我想知道是否有类似的情况,抱歉我的无知。请随意删除这个,我将把它移到codereview@JanDvorak我猜如果一个对象被复制太多,这就是造成内存占用的原因。@SnapGravy创建Test
函数的自调用函数只执行一次,因此你的“私有”变量在new Test()
的所有实例之间共享。这不会浪费内存。@JanDvorak这很酷,这是我最关心的。谢谢,可以肯定地说,这是一种非常可行的JavaScript操作方式。谢谢,这肯定是对我的问题和Jan的评论的一个很好的回答。谢谢你的回答@斯内普·格雷维:不用担心,很高兴这有帮助!如果您对JavaScript OOP感兴趣,您可能会发现它很有帮助。