0

createBar()プライベート プロパティbarがプロパティと同じレベルで作成されるように修正するにはどうすればよいfooですか?

var x = (function() {
  var foo = "a";

  function createBar() {
    this.bar = "b";
  }

  return {
    getFoo: function() {
        return foo;
    },
    getBar: function() {
        return bar;
    }
  }; // end: returned object
}());

モジュールは次のように動作します。

x.getFoo(); // returns a
x.getBar(); // returns b
window.bar; // is undefined (but in my example, it is b)

アップデート:

これは私が今していることです:

var x = (function() {
  var data = {};  //private object holding state variables
  data.foo = "a"; // one state variable

  function createBar() {
    data.bar = "b"; // another dynamically created state variable
  }

  return {
    getFoo: function() {
        return foo;
    },
    getBar: function() {
        return bar;
    }
  }; // end: returned object
}());

しかし、どういうわけか私はそれが好きではありません。プライベート関数間で状態情報を共有するにはどうしますか?

4

2 に答える 2

1

window.bar; // is undefined (but in my example, it is b)

プライベート メソッド createBar を呼び出すと、プロパティ bar = 'b' を持つ新しいオブジェクトになります。

そのプライベートのため、外部からそのプロパティを読み取ることはできません。オブジェクト参照を保存してアクセスできますが、探しているものとは思えません...

別の var を定義することにより、両方の関数のスコープ内になります。

var x = (function() {
    var foo = "a";
    var bar;

    function createBar() {
        bar = "b";
    }

    return {
        getFoo: function() {
            return foo;
        },
        getBar: function() {
            return bar;
        }
    }; // end: returned object
}());

createBar() を呼び出すことを忘れないでください。そうしないと、バーは未定義になります...

于 2012-10-21T13:19:44.530 に答える
0

を削除して外部関数内thisで宣言barするのが最も軽量な解決策ですが、内部dataオブジェクトを使用する解決策はより柔軟です (ただし、 getter を更新して のようなことを行う必要がありますreturn data.foo;)。

オブジェクトを使用する主な利点はdata、JavaScript コードのライブラリを構築している場合、作成しているオブジェクトのコンストラクター/プライベート スコープ内で外部関数/ミックスインを呼び出すことができることです。定義されたインターフェイス。オブジェクトの Adapter スタイルを作成するようなことをしている場合の不自然な例として、linkWithWebService(data)構築時にプライベートスコープのメンバーにデータを入力して動作を追加できるようなものを呼び出すことができます (これらの呼び出しには、ネストされたものと同様の直接アクセスがあります)他の言語のクラス)、ただし、今後のすべての動作は、定義した API によって引き続き制限されます。

または、個人的な経験から、アクセサーが getter:attributeName()と setter:のパターンに従う API を作成しました。これは、getter と内部オブジェクトattributeName(newValue)を作成するための高次関数を作成することで実装しました。data次に、コンストラクターの戻り値でattributeName = makeAccessor(attributeName, data)、作成された関数が属性の唯一の公開になるようにしました。

于 2012-10-21T13:31:22.123 に答える