0

我在一个子模块模式代码中工作。想要使用对象文字创建子模块,问题是this子模块内的对象是 MODULE 而不是我的对象文字。任何想法?

var MODULE.sub = (function () {

   var myObject = {

       key: value,

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

   };

   return myObject.method;

}(MODULE));
4

3 回答 3

0

this关键字的值取决于函数的调用方式。因此,如果您将该函数分配给,然后将MODULE.sub其调用为MODULE.sub(…),那么当然this会指向MODULE。如果您将其调用为myObject.method(…), thenthis将指向该对象。

因此,您要么应该公开整个myObject内容(就像在@BingeBoys 回答中一样),要么不导出该函数并期望它是myObject. 相反,您可以使用绑定的:

return myObject.method.bind(myObject);

或明确的等价物

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

或者你根本不会把函数method放在那个对象上:

…
    var myObject = {
        key: value,
    };
    return function() {
        myObject.key // no `this` here
        …
    };
…
于 2013-05-27T17:04:00.643 回答
0

这对我有用:

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);
           }

       }
   };
})();
于 2013-05-27T04:36:29.890 回答
0

已解决...只需在 MODULE.sub 中返回一个调用公共方法的函数。我不知道是否是最好的方法

var MODULE.sub = (function () {

   var myObject = {

       key: value,

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

   };

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

}(MODULE));
于 2013-05-27T16:32:40.080 回答