如何将对象添加到javascript命名空间?

Fle*_*ore 1 javascript jquery namespaces

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
Run Code Online (Sandbox Code Playgroud)

上面我试图创建一个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');
    }
  };
})();
Run Code Online (Sandbox Code Playgroud)

Edit2:所有jQuery回调似乎都要求以这种方式使用它们,否则就会搞砸了范围.

Fel*_*ing 5

我认为这是一个范围问题.如果你这样做

$(document).ready(this.useSub);
Run Code Online (Sandbox Code Playgroud)

然后this.useSub将在window范围内执行(因此在函数内部,this指向window对象)并且不存在Sub属性.

尝试:

init: function () {
    var obj = this;
    $(function(){obj.useSub()});
}
Run Code Online (Sandbox Code Playgroud)

由于某种原因,它不起作用,$(document).ready(function(){obj.useSub()});但它适用于$()快捷方式.