0

javascriptで返されたオブジェクトからプライベートメソッドを参照するための最良の方法はどれですか?サンプルコードをいくつか残しておきます。

var HelloWorld = (function(){
    var hello = function(){
        console.log("hello")
    },
    return{
        addToList: function(){
            //how can i reference hello from here dynamically like:
                            //this["hello"] or this["hell" + "o"]
        }       
    }
})()
4

5 に答える 5

2

返品はまだクロージャー内にあるため、hello直接電話することができます。それで:

hello();

hello他の回答が推奨するように、それを「動的」にするには、何かに保存する必要があります。別のオブジェクトの代わりにアタッチする場合は、後でアクセスできるようにthis、への参照を保存する必要があります。this

var HelloWorld = (function(){
  var self = this;
  this.hello = function(){
    console.log("hello")
  };
  return {
    addToList: function(){
        self["hello"]();
    }       
  }
})();
于 2013-01-18T18:55:40.560 に答える
1

hello()メソッドではありません。これは単なるクロージャの機能です。したがって、addToList()メソッド内から呼び出すことができます。

hello関数をオブジェクトインスタンスに設定されたメソッドのように動作させる場合thisは、この例のようにインスタンスを渡す必要があります。

var HelloWorld = (function(){
    var hello = function(){
        console.log("hello")
    },
    return{
        addToList: function(){
            //how can i reference hello from here dynamically like:
            hello.call(this);
        }       
    }
})()

あなたが本当にやろうとしているのが文字列参照によってhello関数にアクセスすることである場合、文字列名によってローカル変数に簡単にアクセスすることはできません。これを実行したい場合は、hello関数を次のようなローカルオブジェクトに配置する必要があります。

var HelloWorld = (function(){
    var locals = {
        hello: function(){
            console.log("hello")
        }
    };
    return{
        addToList: function(){
            //how can i reference hello from here dynamically like:
            locals["hello"].call(this);
        }       
    }
})()
于 2013-01-18T18:57:26.010 に答える
1

hello現状では、サンプルコードのコメントに記載されているように、関数を「動的に」参照することはできません。(「動的」の定義には、「hello」という単語を含む文字列が与えられ、関数を参照するために何らかの方法で使用されると想定していますhello。)

ただし、helloをオブジェクトに移動し、角括弧表記を使用してそのオブジェクトから参照することはできます。

var HelloWorld = (function () {
    var privateCode = {
        hello: function () {
            console.log('hello');
        }
    };

    return {
        addToList: function () {
            // access via `privateCode['hello']()`
        }       
    };
}());
于 2013-01-18T19:01:28.697 に答える
1

thisオブジェクトの一部になっていないため、を使用することはできません。

var HelloWorld = (function () {

    var hello = function () { console.log("hello"); };

    return {
        addToList : function () { hello(); }
    };

}());

それはうまくいくでしょう。

文字列を使用してアクセスする必要がある場合は、を作成する必要がありますhello。次に、2つのオプションがあります。

1)文字列で呼び出すことができるパブリック関数を作成します。hello

return {
    command : function (string) { if (this[string]) { this[string](); },
    sayHello : function () { hello(); }
};

2)メソッドを格納するプライベートオブジェクトを作成します(その後、文字列で呼び出すことができます):

var private_actions = {
    hello : function () { console.log("hello"); }
};

return {
    command : function (string) {
        if (private_actions[string]) { private_actions[string](); }
    }
};
于 2013-01-18T19:09:39.503 に答える
1

hello匿名IIFEのスコープ内にのみ存在するため、パブリックメソッドから動的にアクセスできるようにするには、中間オブジェクトを格納する必要がありますhello

var HelloWorld = (function(){
    var privates = {
        hello: function (){
            console.log("hello")
        }
    };

    return {
        addToList: function (){
            privates['hello']();
        } 
    }
})();

HelloWorld.addToList();

実例

于 2013-01-18T19:23:02.877 に答える