Private var внутри объекта JavaScript literal


Как я могу объявить частный var внутри литерального объекта? Потому что у меня есть такой код:

var foo = {

    self: null,

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

    doStuff: function() {
        //stuff here
    }

}

Это работает отлично, но если у меня есть некоторые объекты, то var "self" это переопределит.. очевидно, это глобальный ВАР.. и я не могу использовать ограниченное слово " var " внутри этого объекта..

Как я могу решить эту проблему или создать пространство имен для каждого объекта?

Спасибо!

3 2

3 ответа:

Вы можете создать область действия функции, чтобы скрыть переменную:

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

Хотя неясно, что self предполагается здесь делать, и как foo используется.

Вы должны использовать this:

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

edit Тем не менее, это все еще свойство объекта "foo", и не очень понятно, откуда вы получаете экземпляры "foo". Другими словами, в том, как написан ваш код, есть только один объект.

В качестве альтернативы можно создать объект с закрытием:

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

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

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

Вы даже не используете свойство, которое вы создали. Вместо этого вы создаете другую глобальную переменную с тем же именем. Используйте ключевое слово 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
    }
  };

}());