0

この質問は、私の古い質問Adding scope variable to a constructorの簡略版です。質問は簡単です関数を変更せずに priv 変数を fu() のスコープに追加できますか? (機能ブロック内には追加しません)

ここにフィドルがあります

コードは次のとおりです。

fff = function() {
    alert('constructed');
    //alert(priv);
};
pro = {
    pub: 'public'
}
var make = function(fu, pro) {

    var priv = 'private';
    fu.prototype = pro
    return function() {
      return new fu();
    };
};

var cls = make(fff, pro);
var obj = cls();

alert(obj.pub);​

コメントを外すとわかるように

//alert(priv); 

line Uncaught ReferenceError: priv is not defined エラー。

fu() 関数オブジェクトのスコープを再定義する方法が必要です。

4

2 に答える 2

0

オブジェクトまたはクロージャの内部から関数を呼び出して、関数のスコープを変更することはできません。

ただし、変数を関数のスコープ、つまりグローバルスコープに追加することはできます。

window.priv = 'private';

これにより、関数は変更なしで機能しますが、変数はあまりプライベートではありません...

于 2012-09-02T00:38:40.237 に答える
0

オブジェクトがリストされていませんfuが、答えは「はい」だと思います。「関数」を変更せずにプライベート変数を追加できます。さて、私は何かが足りないかもしれませんが、私があなたに従うなら、あなたが望むものはここにあります:

var fu = {
           DoStuff: function(someVar){
            alert(someVar);
}
};

その後、コードで次のようにします。

fu["NewPrivateVar"] = "something!";

またはドット表記で:

fu.NewPrivateVar = "someting!";

ついに:

fu.DoStuff(fu.NewPrivateVar);

結果:

"something!"

それはあなたがやろうとしていることですか?

于 2012-09-02T00:28:41.750 に答える