JavaScript OOP 私有(private)变量

标签 javascript oop class prototype

<分区>

更新:这是对我之前的问题的更新,关于这个 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;
})();

关于JavaScript OOP 私有(private)变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13527363/

相关文章:

javascript - 显示子节点 NodeList 的最简单方法? (初学者)

javascript - 使用 Django + react-router 找不到 404 页面

c# - 为什么方法在 Java 中默认是虚拟的,而在 C# 中默认是非虚拟的?

language-agnostic - 方法应该属于谁?

java - 为什么 StringBuffer/StringBuilder 不重写 equals 或 hashCode?

c++ - 构造函数有问题

javascript - 为什么要使用构造函数?

javascript - React 如何以 `this` 不引用类本身的方式调用 ES6 类的渲染函数?

javascript - Pyodide languagePluginLoader 未定义

javascript - 将变量传递给 Google 饼图