Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript OOP私有变量_Javascript_Oop_Class_Prototype - Fatal编程技术网

JavaScript OOP私有变量

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() {

更新:这是对我上一个问题的更新,这个问题与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,以便能够访问上述设置中的私有变量


我询问的原因是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感兴趣,您可能会发现它很有帮助。