Javascript 对象文字和';这';在子模块模式中

Javascript 对象文字和';这';在子模块模式中,javascript,module-pattern,Javascript,Module Pattern,我在一个子模块模式代码中工作。如果要创建具有对象文字的子模块,问题是子模块中的对象是模块而不是我的对象文字。有什么想法吗 var MODULE.sub = (function () { var myObject = { key: value, method: function () { this.key // this = MODULE and not MyObject... :( } }; return

我在一个子模块模式代码中工作。如果要创建具有对象文字的子模块,问题是子模块中的对象是模块而不是我的对象文字。有什么想法吗

var MODULE.sub = (function () {

   var myObject = {

       key: value,

       method: function () {
           this.key // this = MODULE and not MyObject... :(
       }

   };

   return myObject.method;

}(MODULE));
这对我很有用:

var MODULE = MODULE || {};   
MODULE.sub = (function () {

   return {

       myObject : {

           key : 10,

           method : function() {
              console.log(this.key);
           }

       }
   };

})();
那就叫它:

MODULE.sub.myObject.method();
您只是返回方法,而不是键,因此“this”将是未定义的。如果您想这样做,可以将其保持为私有,并将密钥作为var传入:

  var MODULE = MODULE || {};
  MODULE.sub = (function () {

      var key = 10,

   return {

       myObject : {



           method : function() {
              console.log(key);
           }

       }
   };
})();

解决了。。。只需返回MODULE.sub中调用public方法的函数。我不知道这是不是最好的办法

var MODULE.sub = (function () {

   var myObject = {

       key: value,

       method: function () {
           this.key // this = myObject :)
       }

   };

   return function () {
        myObject.method();
    }

}(MODULE));
s值取决于函数的调用方式。因此,如果您将该函数分配给
MODULE.sub
,然后将其作为
MODULE.sub(…)
调用,那么
当然将指向
模块。如果您将其作为
myObject.method(…)
调用,则
将指向该对象

因此,您要么公开整个
myObject
(如@bingebooys answer),要么不导出该函数,期望它是
myObject
的一种方法。相反,您可以使用一个:

或者是明确的等价物

return function() {
    return myObject.method();
};
或者您根本不会将函数作为
method
放在该对象上:

…
    var myObject = {
        key: value,
    };
    return function() {
        myObject.key // no `this` here
        …
    };
…

如何创建和调用子模块?更好的方法是提供一个小提琴。如果像
Module.sub.method()
那样调用它,那么
Module.sub
myObject
方法中的
this
应该是同一个对象。小提琴:@josephdreamer:注意,他没有导出
myObject
,但唯一的问题是function@Bergi这是15小时前编辑的。最初,
myObject
已导出。
…
    var myObject = {
        key: value,
    };
    return function() {
        myObject.key // no `this` here
        …
    };
…