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

いいえ、できません。

プライベート変数にアクセスできるパブリック メソッドは、特権メソッドと呼ばれます。

Douglas Crockford によるJavaScript のプライベート メンバーから:

特権メソッドは、プライベート変数とメソッドにアクセスでき、それ自体がパブリック メソッドと外部からアクセスできます。特権メソッドを削除または置換することはできますが、それを変更したり、秘密を強制的に放棄させたりすることはできません。

特権メソッドはthis、コンストラクター内で割り当てられます。

次に、プロトタイプを使用して特権メソッドを宣言することはできません。

于 2013-10-04T00:17:50.283 に答える
0

新しい Javascript 機能を使用すると、真にプライベートなメンバーを持つことができます。基本的に、WeakMap を使用してメンバーを非表示にすることができます。

これは 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!

すべての関数の先頭に 1 行追加することで、プライベート オブジェクトを返すことができます。priv私はこれを、パブリック メンバーが継続しthis、プライベート メンバーが というようにpriv、素晴らしく一貫したものと呼ぶのが好きです。

これには、インスタンスごとにクロージャーを作成するのではなく、すべてのメソッドのインスタンスが 1 つしかないという優れた利点があります。

于 2014-03-25T19:26:47.463 に答える