2

リテラルオブジェクト内でプライベート変数を宣言するにはどうすればよいですか? 私はこのコードを持っているので:

var foo = {

    self: null,

    init: function() {
        self = this;
        self.doStuff();
    },

    doStuff: function() {
        //stuff here
    }

}

これは完全に機能しますが、いくつかのオブジェクトがある場合、変数「自己」がオーバーライドされます..明らかにそれはグローバル変数です..そして、このオブジェクト内で制限された単語「var」を使用することはできません..

これを解決するにはどうすればよいですか、または各オブジェクトの名前空間を作成するにはどうすればよいですか?

ありがとう!

4

3 に答える 3

6

変数を非表示にする関数スコープを作成できます。

var foo = (function() {
  var self = null
  return {
    init: ...,
    doStuff: ...
  };
})();

selfここで何をすべきか、どのように使用されるかは明確ではありませんがfoo

于 2011-12-06T15:35:15.023 に答える
0

作成したプロパティを使用していません。代わりに、同じ名前で別のグローバル変数を作成します。thisプロパティにアクセスするには、次のキーワードを使用します。

var foo = {

  self: null,

  init: function() {
    this.self = this;
    this.self.doStuff();
  },

  doStuff: function() {
    //stuff here
  }

}

(プロパティに保存thisするのは本当に無意味ですが...)

オブジェクトにローカル変数が必要な場合は、そのクロージャーを作成します。

var foo = (function(){

  var self = null;

  return {

    init: function() {
      self = this;
      self.doStuff();
    },

    doStuff: function() {
      //stuff here
    }
  };

}());
于 2011-12-06T15:37:23.307 に答える
0

使用する必要がありますthis

init: function() {
  this.self = this;
  this.self.doStuff();
},

編集ただし、これは依然として「foo」オブジェクトのプロパティであり、「foo」のインスタンスをどこから取得しているかが明確ではありません。つまり、コードの記述方法では、オブジェクトは 1 つしかありません。

または、クロージャーを使用してオブジェクトを作成することもできます。

var foo = function() {
    var self = null;

    return {
      init: function() {
        self = this;
        self.doStuff();
      },

      doStuff: function() {
        //stuff here
      }
    };
}();
于 2011-12-06T15:35:00.217 に答える