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

时间:2010-06-16 19:23:21

标签: 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

上面我正在尝试创建一个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 个答案:

答案 0 :(得分:5)

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

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

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

尝试:

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

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

答案 1 :(得分:2)

这是一种方式

var Test = {
  useSub : function () { 
    Test.Sub.sayHi(); 
  }, 
  init: function () { 
    $(document).ready(Test.useSub); 
  },
  Sub: {
    sayHi: function () { 
      alert('hi'); 
    } 
  }
};

答案 2 :(得分:1)

在这一行:

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

您正在传递对函数的引用并且范围丢失 - 当函数运行时,this不再意味着Test