Закрытая переменная внутри литерального объекта Javascript - PullRequest
2 голосов
/ 06 декабря 2011

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

var foo = {

    self: null,

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

    doStuff: function() {
        //stuff here
    }

}

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

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

Спасибо!

Ответы [ 3 ]

6 голосов
/ 06 декабря 2011

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

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

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

0 голосов
/ 06 декабря 2011

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

}());
0 голосов
/ 06 декабря 2011

Вы должны использовать 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
      }
    };
}();
...