11

プライベート変数に動的にアクセスするモジュールパターンからパブリック関数を持つ方法はありますか? test1 は、「動的にアクセス」の意味を示していますが、パブリック変数を使用しています

var x = (function(){
    var x=0, y=2, z=5;

    return {
        toast: 123,
        test1: function(arg){
            return this[arg];
        },
        test2: function(){
            // ??
        }
    };
}());

console.log(x.test1("toast")); // 123
console.log(x.test2("y")); // should return 2

プライベート変数を格納する単一のプライベート変数(オブジェクト)を作成することになったので、そのようにアクセスできました

 privateVarStore[privateVarName]

しかし、それに対する別の解決策はありますか?

4

2 に答える 2

10

デモ

はい。

Adam Rackis を失望させて申し訳ありませんが、(の) eval でそれを行うことができます:

var x = (function(){
    var x=0, y=2, z=5;

    return {
        toast: 123,
        test1: function(arg){
            return this[arg];
        },
        test2: function(a){
            return eval(a)
        }
    };
}());

console.log(x.test1("toast")); // 123
console.log(x.test2("y")); // should return 2  -> does return 2

evalこれは、使用すべき数少ない例外の 1 つです。

編集、Hans B PUFAL の提案 (コメント)test2に従って、次のようにパラメーターを検証できます。

test2: function(a){
    return /^[$_a-z][$_a-z0-9]*$/i.test (a) ? eval(a) : undefined;
}
于 2011-12-25T05:36:17.200 に答える
7

いいえ(少なくともevalqwertymkの回答によると、に頼ることなく)。

yのプロパティではありません(ローカル変数との混同を避けるxよりも、このオブジェクトに適切な名前を付けることを検討してください)。 のメソッドがクロージャを形成 したローカル変数です。xxyx

xのメソッドはいずれも にアクセスできますyが、 と言うthis.yのではなく、y直接アクセスすることによってアクセスできます。

繰り返しyますが、あなたの object のプロパティではありませんxxこれは、を作成した関数内のローカル変数にすぎないため、xのメソッドがその上にクロージャを形成します。

したがって、test2return を取得するにyは、次のようにします。

test2: function(){
    return y;
}

プライベート変数にアクセスできるメソッドを作成するには、次のように考えてください。

var x = (function () {
    var privateMembers = { x: 0, y: 2, z: 5 };

    return {
        getPrivate: function (name) {
            return privateMembers[name];
        },
        toast: 123,
        test1: function (arg) {
             return this[arg];
        },
        test2: function () {
           // ??
        }
    };
})();

その後

alert(x.getPrivate("y")); //alerts 2

このフィドルをチェックしてください

于 2011-12-25T04:28:54.377 に答える