3

更新:这是对我之前的问题的更新,该问题对于 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() 中定义的函数。我不知道它目前是否有任何实际用途,但看看它是否有可能会很有趣。

4

1 回答 1

2

您所拥有的问题是您的_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变量,你所拥有的一切都很好。它使您可以拥有所有实例共享的私有数据和功能,这非常方便。如果您需要拥有特定于每个实例的真正私有数据,则需要在构造函数本身中创建使用该数据的函数:

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;
})();
于 2012-11-23T11:17:28.813 回答