Как вы добавляете объекты в пространство имен javascript? - PullRequest
1 голос
/ 16 июня 2010
var Test = (function() {
    return {
        useSub: function () {
            this.Sub.sayHi();
        },

        init: function () {
            $(document).ready(this.useSub);
        }
    };
})();

Test.Sub = (function () {
    return {
        sayHi: function () {
            alert('hi');
        }
    };
})();

Test.useSub(); // works
Test.init(); // explodes

Выше я пытаюсь создать пространство имен Test и добавить к нему объект Sub.У меня все было хорошо, пока я не попытался использовать объект в jQuery.Ошибка "Uncaught TypeError: Невозможно вызвать метод 'sayHi' из неопределенного".Если есть лучший способ сделать это, я открыт для этого.

Редактировать:

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

var Namespace (function () {
  return {
    init: function () {
      $(document).ready(function() {
        Namespace.onReady();
      }
    },
    onReady: function() {
      alert('Now I am back in the Namespace scope. Proceed as planned');
    }
  };
})();

Edit2: Кажется, что все обратные вызовы jQuery требуют, чтобы они использовались таким образом, иначеоблажался.

Ответы [ 3 ]

5 голосов
/ 16 июня 2010

Я думаю, что это проблема масштаба.Если вы выполните

$(document).ready(this.useSub);

, то this.useSub будет выполнено в области действия window (то есть внутри функции this относится к объекту window), и * не существует Sub атрибут.

Попробуйте:

init: function () {
    var obj = this;
    $(function(){obj.useSub()});
}

По некоторым причинам он не работает с $(document).ready(function(){obj.useSub()});, но работает с ярлыком $().

2 голосов
/ 16 июня 2010

Вот один из способов

var Test = {
  useSub : function () { 
    Test.Sub.sayHi(); 
  }, 
  init: function () { 
    $(document).ready(Test.useSub); 
  },
  Sub: {
    sayHi: function () { 
      alert('hi'); 
    } 
  }
};
1 голос
/ 16 июня 2010

в этой строке:

$(document).ready(this.useSub);

вы передаете ссылку на функцию, и область действия теряется - когда функция выполняется, this больше не означает Test.

...