在Javascript中访问私有成员的公共方法

时间:2013-10-04 00:09:07

标签: javascript object

我希望能够在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 () {};

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

是否有某种方法可以避免每次构造对象时必须为公共方法创建新函数的开销,还能让他们访问私有成员吗?

2 个答案:

答案 0 :(得分:3)

不,你不能。

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

来自Private Members in JavaScript,道格拉斯·克罗克福德:

  

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

     

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

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

答案 1 :(得分:0)

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

这在Firefox中支持,并在"实验Javascript"在Chromium的旗帜。

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上保密,并且非常一致。

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