2

我希望能够在 Javascript 中创建一个对象,该对象具有可以访问对象私有成员的公共方法。但是,我听说每次创建对象时声明公共方法都会产生开销,所以我宁愿避免这种开销。因此,例如,此代码将执行我想要的操作:

function createMyObject(parameter) {
    var that = {};

    var privateVariable,
        privateMethod = function () { return 1; };

    that.publicVariable = 0;

    that.publicMethod = function () {
        privateVariable = privateMethod();
    }

    return that;
}

但是每次有人调用 createMyObject 时,它都必须创建函数来设置公共方法。相反,如果我这样做:

function MyClass(parameter) {
    var privateVariable,
        privateMethod = function () { return 1; };

    this.publicVariable = 0;
}

MyClass.prototype.publicMethod = function () {};

在这里,我可以避免每次构造对象时都必须创建新函数来设置公共方法,但是这些公共方法不能访问对象的私有成员。

有什么方法可以避免每次构造对象时都必须为公共方法创建新函数的开销,而且还能让它们访问私有成员?

4

2 回答 2

3

不,你不能。

能够访问私有变量的公共方法称为特权方法

来自JavaScript 中的 Private Members,作者 Douglas Crockford:

特权方法能够访问私有变量和方法,并且它本身可以被公共方法和外部访问。可以删除或替换特权方法,但不能更改它,或强制它放弃其秘密。

this特权方法在构造函数中分配

然后,您不能使用原型声明特权方法。

于 2013-10-04T00:17:50.283 回答
0

使用新的 Javascript 功能,您可以拥有真正的私人成员。基本上你可以使用 Wea​​kMap 来隐藏你的成员。

这在 Firefox 和 Chromium 中的“Experimental Javascript”标志后面受支持。

var MyClass = (function(){
    var privmap = new WeakMap; // This holds our private members.  Keep it secret.

    function MyClass(){
        var priv = {};
        privmap.set(this, priv); // Add your private object for this instance.

        this.notsec = "Anyone can access this!";
        priv.secret = "Only code in this closure can see this!";
    }
    MyClass.prototype.secret = function MyClass_secret() {
        var priv = privmap.get(this); // Get our private object.
        return priv.secret; // Retrieve.
    }

    return MyClass;
})();

var o = new MyClass;
console.log(o.secret()); //-> Only code in this closure can see this!

通过在每个函数的开头添加一行,您可以返回您的私有对象。我喜欢这样称呼它priv,以便公共成员继续this和私人继续priv,很好和一致。

这样做的好处是每个方法只有一个实例,而不是为每个实例创建一个闭包。

于 2014-03-25T19:26:47.463 回答